在prolog中将基数10转换为基数2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在prolog中将基数10转换为基数2相关的知识,希望对你有一定的参考价值。
我试图使用prolog将基数10转换为基数2这是我的代码:
binary(X,B) :- X > -1 , tobin(B,X,1).
tobin(S,0,1) :- S is 0.
tobin(S,0,V) :- V>1 , S is 1.
tobin(S,X,V) :- X > 0 ,
X1 is X // 2 ,
V1 is V * 10 ,
tobin(S1,X1,V1),
S is X mod 2 ,
S is S + S1 * V1 .
它不起作用:/你能帮助我吗?非常感谢你:D
答案
如果您想知道原始代码有什么问题,请研究一下:
binary(X,B) :- X > -1 , tobin(B,X).
/*tobin(S,0,1) :- S is 0.*/
/* tobin(S,0,V) :- V>1 , S is 1.*/
tobin(0,0).
tobin(S,X) :- X > 0 ,
X1 is X // 2 ,
/*V1 is V * 10 , */
tobin(S1,X1),
S0 is X mod 2 ,
S is S0 + S1 * 10 .
主要有两个变化:
- 我在一个地方将
S
重命名为S0
,因为没有一个声明总是错误的(S is S +...
); - 我已经从
tobin
删除了第三个参数,因为没有必要将位置值传递给循环调用,并且在所有这些重复性中,一些错误在我看来并不清楚。
修复后,您的代码看起来更好,来自@damianodamiano(在我看来):
binary(X,B) :- X > -1 , tobin(B,X).
tobin(0,0).
tobin(S,X) :- X > 0 ,
X1 is X // 2 ,
tobin(S1,X1),
S0 is X mod 2 ,
S is S0 + S1 * 10 .
实际上,你可以跳过binary
并直接调用tobin
(参数顺序相反),这使得它更简单:
tobin(0,0).
tobin(S,X) :- X > 0 ,
X1 is X // 2 ,
tobin(S1,X1),
S0 is X mod 2 ,
S is S0 + S1 * 10 .
@damianodamiano的主要优点是尾部递归的运行时优化。
另一答案
我写了一个谓词来解决你的问题:
dec2Bin(0,V,_,V).
dec2Bin(N,V,Counter,Val):-
Reminder is N mod 2,
N1 is N//2,
V1 is V + Reminder*(10^Counter),
Counter1 is Counter + 1,
dec2Bin(N1,V1,Counter1,Val).
convert(N,V):-
N > -1,
dec2Bin(N,0,0,V),
writeln(V).
?- convert(8,V).
V = 1000.
以上是关于在prolog中将基数10转换为基数2的主要内容,如果未能解决你的问题,请参考以下文章
当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?