递归让我很困惑

时间:2018-05-21 22:12:54

标签: prolog

我理解了递归的理论部分。我看过练习但是我很困惑。我试图解决一些问题,一些我理解,一些我不理解。这个练习让我很困惑。我无法理解为什么,所以我用评论来向你展示我的弱点。我应该有力量(X,N,P)所以P = X ^ N. 一些例子:

?- power(3,5,X).
X = 243
?- power(4,3,X).
X = 64
?- power(2,4,X).
X = 16 

本练习的解决方案是:(也见评论)

power(X,0,1).      % I know how works recursion,but those numbers 0 or 1 why? 
power(X,1,X).      % X,1,X i can't get it.
power(X,N,P) :-    % X,N,P if only 
   N1 is N-1,      % N1=N-1 ..ok i understand
   power(X,N1,P1), % P1 is used to reach the the P
   P is P1*X.      % P = P1*X 

我知道递归,我使用了不同的例子

related(X, Y) :-              
   parent(X, Z),                 
   related(Z, Y).

将我的例子与练习比较。我可以说我的第一线,我的想法。请帮帮我,这很麻烦。

related(X, Y) :-power(X,N,P) :-类似。我的示例parent(X, Z),的第二句与N1 is N-1,类似,第三句related(Z, Y).power(X,N1,P1),P is P1*X.相似。

1 个答案:

答案 0 :(得分:2)

让我们一步一步地讨论谓词的定义。首先你有事实......

power(X,0,1).

...表明:任何 X 的0次方 1。然后是事实......

power(X,1,X).

...说明:任何 X 的第一个力量是 X 本身。最后,你有一个递归规则:

power(X,N,P) :-    % P is the Nth power of X     if 
   N1 is N-1,      % N1 = N-1                    and
   power(X,N1,P1), % P1 is the N1th power of X   and
   P is P1*X.      % P = P1*X

可能你的困惑是由于两个事实表达的两个基本案例(其中一个实际上是多余的)。我们来考虑以下问题:

?- power(5,0,X).
X = 1 ;
ERROR: Out of local stack

答案1肯定是我们所期望的,但是然后谓词循环直到它耗尽堆栈。这当然不可取。而这个查询...

?- power(5,1,X).
X = 5 ;
X = 5 ;
ERROR: Out of local stack

...在用完堆栈之前两次产生正确的答案。冗余答案的原因是递归规则可以将任何给定的N减少为零为一,从而产生相同的答案两次。如果你看一下递归规则的结构,很明显第一个基本情况就足够了,所以让我们删除第二个。循环出堆栈的原因是,在N变为零之后,递归规则将搜索其他解决方案(对于N=-1N=-2N=-3,... )不存在。为避免这种情况,您可以添加一个目标,以防止递归规则进一步搜索,如果N等于或小于零。这留下了以下定义:

power(X,0,1).      % the 0th power of any X is 1
power(X,N,P) :-    % P is the Nth power of X     if
   N > 0,          % N > 0                       and
   N1 is N-1,      % N1 = N-1                    and
   power(X,N1,P1), % P1 is the N1th power of X   and
   P is P1*X.      % P = P1*X

现在谓词按预期工作:

?- power(5,0,X).
X = 1 ;
false.

?- power(5,1,X).
X = 5 ;
false.

?- power(5,3,X).
X = 125 ;
false.

我希望这可以减轻你的一些困惑。