首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog,检查术语是否为2的幂

Prolog,检查术语是否为2的幂
EN

Stack Overflow用户
提问于 2013-10-30 07:12:00
回答 3查看 1K关注 0票数 0

我编写了下面的代码,这些代码应该与我的逻辑工作,但它没有。

我应该检查一下,给定的条件是否等于2的幂。例如,s(s(s(nul)))应该返回false,s(s(s(s(nul)))应该返回true。

代码语言:javascript
复制
substractWhileY(X,0,rezult).
substractWhileY(s(X),Y,rezult):-
   Y > 0, number is 1,  substractWhileY(X,Y - number, rezult).

degreeOftwo(X):-
   substractWhileY(X,2,rezult),
   pagalba(X, 2, rezult).
calculateAnswer(X, currentCounter, currentValue):-
   currentCounter is currentCounter * 2,
   substractWhileY(currentValue, currentCounter , rezult),
   rezult\= null,
   calculateAnswer(X, currentCounter , rezult).

我的想法是检查给定的热度是否是任意2的度,如果不是,它不是2的程度。

用数字应该是这样的。例如,我给出了数字8。

代码语言:javascript
复制
First time it checks if 8 - 2 = 0.
second time if 8 - 4 = 0.
third time if 8 - 8 = 0.

2的8次方幂。

也许其他的解决方案会更好,所以谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-30 09:52:02

假设您正在寻找数字1、2、4、8.或者换句话说,2^0,2^1,2^2,2^3,.,那么一个确定性的解可以是:

代码语言:javascript
复制
two_power_n(s(X)) :-
    two_power_n_minus_one(X). 

two_power_n_minus_one(0).
two_power_n_minus_one(s(X)) :-
    half(s(s(X)), s(Y)),
    two_power_n_minus_one(Y).

half(0, 0).
half(s(s(X)), s(Y)) :-
    half(X, Y).

我不认为这个解决方案是最佳的。

票数 2
EN

Stack Overflow用户

发布于 2013-10-30 18:14:21

利用计算机中用于符号整数的两个补表示的属性,找出一个不动点、两个补整数是否为2的幂是很容易的:

代码语言:javascript
复制
pow2( X ) :-     % X is a power of 2, if...
  X > 0 ,        % - X is > 0 , and ...
  X is X /\ (-X) % - A bitwise AND of X and its 2s complement yields X
  .              % Easy!

不需要递归,只需要一点点旋转。

考虑到这一点,解决办法很容易。只需遍历嵌套结构s/1并计算其深度/长度。然后确定这是否是2的幂。

代码语言:javascript
复制
IsPowerOf2( S ) :- nested_depth(S,0,D) , pow2(D) .

nested_depth( nul  , D , D ).
nested_depth( s(X) , T , D ) :-
  T1 is T+1 ,
  nested_depth(X)
  .
票数 2
EN

Stack Overflow用户

发布于 2013-10-30 15:29:43

Boris的答案肯定更完整/更正确(+1),我比他的半/2谓词早。但以这种方式解决你的问题似乎更简单:

代码语言:javascript
复制
pow_of_two(s(nul)).
pow_of_two(X) :-
    half(X, H),
    pow_of_two(H).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19675977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档