我理解了递归的理论部分。我看过练习但是我很困惑。我试图解决一些问题,一些我理解,一些我不理解。这个练习让我很困惑。我无法理解为什么,所以我用评论来向你展示我的弱点。我应该有力量(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.
相似。
答案 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=-1
,N=-2
,N=-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.
我希望这可以减轻你的一些困惑。