Recursion Prolog中的幂和
我试图实现一个方法,使用递归实现如下工作Recursion Prolog中的幂和,recursion,prolog,Recursion,Prolog,我试图实现一个方法,使用递归实现如下工作foo(5)=5^4+4^3+3^2+2^1+1^0=701。我一直在尝试遵循逻辑,但我总是出错。有人能指引我吗 (define (foo n) ; size-n problem ( cond ( (= (- n 1) 0 ) ; stopping condition 0 ); return value (else (+ ( expt n (- n 1) ) ( foo (- n 1) ) ) ))) ; size-m problems 如果
foo(5)=5^4+4^3+3^2+2^1+1^0=701
。我一直在尝试遵循逻辑,但我总是出错。有人能指引我吗
(define (foo n) ; size-n problem
( cond ( (= (- n 1) 0 ) ; stopping condition
0 ); return value
(else (+ ( expt n (- n 1) ) ( foo (- n 1) ) ) ))) ; size-m problems
如果您正确地标记了问题,您希望在Prolog中回答这个问题,但您的代码片段建议您使用
lisp
(或我不知道的语言)
在Prolog中,您编写预测。对于您的问题,有两种情况:
foo(N,0) :-
N =< 0,
!.
foo(N,S) :-
N1 is N-1,
foo(N1,T),
S is T+N^N1.
N
小于或等于零的情况,即为零:
foo(N,0) :-
N =< 0,
!.
foo(N,0) :-
N =< 0,
!.
foo(N,S) :-
N1 is N-1,
foo(N1,T),
S is T+N^N1.
通过添加对归纳情况的检查,您可以使该谓词更安全地避免循环:
foo(N,0) :-
N =< 0,
!.
foo(N,S) :-
N > 0,
N1 is N-1,
foo(N1,T),
S is T+N^N1.
foo(N,0):-
N=<0,
!.
傅(北,南):-
N>0,
N1是N-1,
foo(N1,T),
S是T+N^N1。
或者,您可以使用累加器进一步提高谓词的性能:
foo(N,S) :-
foo(N,0,S).
foo(N,S,T) :-
N > 0,
!,
N1 is N-1,
Q is S+N^N1,
foo(N1,Q,T).
foo(N,S,S) :-
N =< 0.
foo(N,S):-
foo(N,0,S)。
foo(N,S,T):-
N>0,
!,
N1是N-1,
Q是S+N^N1,
foo(N1,Q,T)。
foo(N,S,S):-
N=<0。
这个版本还首先检查
N>0
之前是否N=<0
,因为这是一个更可能的场景:在一个N=<0
之后,我们停止递归,而N>0
将被调用N-1次。使用累加器可以实现一种称为尾部递归的优化技术。据我所知,这看起来根本不像Prolog。这看起来像是lisp
这是一个非常不清楚的问题。你的题目是Prolog递归逻辑“。您正在显示类似Lisp代码的内容,并说我不断出错。那有人能指引我吗?。你在做什么造成错误?你到底看到了什么错误?您正在尝试创建一个工作的Lisp程序还是一个工作的Prolog程序?要使您的Lisp代码正常工作,请将define
替换为defun
,将else
替换为t
。有人能指导我修复错误吗。有什么是不可理解的呢?@Lourger我也知道prolog和lisp之间的区别,但我在标题中犯了一个错误,因为我目前正在处理这两个问题。这个网站的使命是帮助程序员找到答案,这样你就可以简单地指出我的错误而不显得粗鲁。@Shahad:你最初把它表述为一个序言问题。所以请不要把它改成别的意思。如果你改变主意,请问一个新问题。Mnmn:现在只是慢了。@false:只是慢了?我同意一个更好的方法是使用累加器。。。。而且不太地道。也就是说:下次,你会再次犯这个错误。@false:当然,一旦超过20,大脑就不再那么灵活了。尽管一位亲密的医生说这是为了保护一个人免受精神病的伤害;)
foo(N,S) :-
foo(N,0,S).
foo(N,S,T) :-
N > 0,
!,
N1 is N-1,
Q is S+N^N1,
foo(N1,Q,T).
foo(N,S,S) :-
N =< 0.