您好我试图修改十进制到二进制转换函数,以便它会在列表中显示结果。我是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]
有人可以帮助我理解我做错了什么。 感谢
答案 0 :(得分:2)
您必须应用一些列表并置,但是当您认为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
可以是library predicate或您自己的implementation。
答案 1 :(得分:2)
如果你修改你的代码
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,或通过累加器反转顺序
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).