在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 为基数的数字转换如何工作?

当我将基数为 10 的数字转换为基数为 2 的数字时,为啥位会重复?

从十进制基数转换为十六进制基数c ++

我应该在基数排序中使用哪个基数?以及如何在基数之间转换?

将基数为 10 的数字转换为 .NET 中任何基数的最快方法?

JavaScript中将字符串类型转换为整形的函数