gpt4 book ai didi

prolog - 序言中前n个数字的总和

转载 作者:行者123 更新时间:2023-12-04 23:51:20 25 4
gpt4 key购买 nike

你好谁能帮我计算前 n 个数字的总和。例如 n=4 => 总和 = 10。到目前为止,我已经写了这个

    predicates
sum(integer,integer)
clauses

sum(0,0).
sum(N,R):-
N1=N-1,
sum(N1,R1),
R=R1+N.

这个可行,但我需要另一个实现。我不知道如何使它与众不同。请帮忙

最佳答案

@mbratch 说的。

您正在计算的是 triangular number .如果你的作业是关于三角数而不是学习递归思维,你可以简单地这样计算:

triangular_number(N,R) :- R is N * (N+1) / 2 .

如果更有可能,您正在学习递归思想,请尝试以下操作:

 sum(N,R) :-    % to compute the triangular number n,
sum(N,1,0,R) % - invoke the worker predicate with its counter and accumulator properly seeded
.

sum(0,_,R,R). % when the count gets decremented to zero, we're done. Unify the accumulator with the result.
sum(C,X,T,R) :- % otherwise,
C > 0 , % - assuming the count is greater than zero
T1 is T+X , % - increment the accumulator
X1 is X+1 , % - increment the current number
C1 is C-1 , % - decrement the count
sum(C1,X1,T1,R) % - recurse down
. % Easy!

编辑添加:

或者,如果您更喜欢倒计时方法:

 sum(N,R) :- sum(N,0,R).

sum(0,R,R). % when the count gets decremented to zero, we're done. Unify the accumulator with the result.
sum(N,T,R) :- % otherwise,
N > 0 , % - assuming the count is greater than zero
T1 is T+N , % - increment the accumulator
N1 is N-1 , % - decrement the count
sum(N1,T1,R) % - recurse down
. % Easy!

这两者都是尾递归,这意味着序言编译器可以将它们转化为迭代(谷歌“尾递归优化”了解详情)。

如果你想消除累加器,你需要做这样的事情:

sum(0,0).
sum(N,R) :-
N > 0 ,
N1 is N-1 ,
sum(N1,R1) ,
R is R1+N
.

稍微简单一点,但每次递归都会消耗另一个堆栈帧:给定足够大的 N 值,执行将因堆栈溢出而失败。

关于prolog - 序言中前n个数字的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21031685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com