List 序言:将元素放入列表中进行十进制到二进制的转换
您好,我试图修改一个十进制到二进制的转换函数,这样它就可以在列表中显示结果。我是prolog新手,似乎无法让它正常工作List 序言:将元素放入列表中进行十进制到二进制的转换,list,prolog,List,Prolog,您好,我试图修改一个十进制到二进制的转换函数,这样它就可以在列表中显示结果。我是prolog新手,似乎无法让它正常工作 dec2bin(0,0). dec2bin(1,1). dec2bin(N,L):- N>1,X is N mod 2,Y is N//2, dec2bin(Y,L1), L = [L1|[X]]. 那么这就是结果: 86 ?- dec2bin(26,L). L = [[[[1, 1], 0], 1], 0] 有人能帮我理解我做错了什么吗。 感谢你必须应用一些链表
dec2bin(0,0).
dec2bin(1,1).
dec2bin(N,L):- N>1,X is N mod 2,Y is N//2, dec2bin(Y,L1), L = [L1|[X]].
那么这就是结果:
86 ?- dec2bin(26,L).
L = [[[[1, 1], 0], 1], 0]
有人能帮我理解我做错了什么吗。
感谢你必须应用一些链表连接,但是你只需创建两个术语表,并将它们嵌套为<代码> L= [L1[x] ] < /代码>,当你考虑<代码> L1<代码>只是一个数字时。
如果你把它看作一个列表,你可以简单地将它附加到新创建的<代码> x>代码>,但是要做到这一点,你必须重写递归的基本情况:
dec2bin(0,[0]).
dec2bin(1,[1]).
dec2bin(N,L):-
N > 1,
X is N mod 2,
Y is N // 2,
dec2bin(Y,L1),
append(L1, [X], L).
屈服于:
?- dec2bin(26,L).
L = [1, 1, 0, 1, 0]
其中append/3
可以是a或您自己的。如果您修改代码
dec2bin(0,[0]).
dec2bin(1,[1]).
dec2bin(N,L):-
N > 1,
X is N mod 2,
Y is N // 2,
dec2bin(Y,L1),
L = [X|L1].
您将以相反的顺序获得解决方案:
?- dec2bin(26,L).
L = [0, 1, 0, 1, 1]
而不是追加每个位,考虑最后的倒数/ 2,或者用累加器< /P>反转顺序。
dec2bin(N,L) :- dec2bin(N,[],L).
dec2bin(0,L,[0|L]).
dec2bin(1,L,[1|L]).
dec2bin(N,L,R):-
N > 1,
X is N mod 2,
Y is N // 2,
dec2bin(Y,[X|L],R).
我不认为这个子句是非常有用的
dec2bin(0,L,[0 | L])
@joel76,如果没有这个子句,或者用什么东西来代替它,dec2bin(0,L)。
将失败。