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.