Recursion prolog递归错误(简单)

Recursion prolog递归错误(简单),recursion,prolog,stack,Recursion,Prolog,Stack,我不熟悉序言。我在做一个递归程序问题是即使它打印出答案。。打印答案后,它不会停止,最终会给出“本地堆栈外”。 我已经读到它可能是一个左递归问题,但正如我已经告诉你们的,我对prolog是新手,我真的不明白会发生什么。。。 所以这是代码 f(X, Y):- Y is sqrt(1-((X-1)*(X-1))). sum(SEGMENTS, 1, TOTAL):- f(2/SEGMENTS*1,H1), TOTAL is (2/SEGMENTS)*H1. sum(SEGM

我不熟悉序言。我在做一个递归程序问题是即使它打印出答案。。打印答案后,它不会停止,最终会给出“本地堆栈外”。 我已经读到它可能是一个左递归问题,但正如我已经告诉你们的,我对prolog是新手,我真的不明白会发生什么。。。 所以这是代码

f(X, Y):-
    Y is sqrt(1-((X-1)*(X-1))).

sum(SEGMENTS, 1, TOTAL):-
    f(2/SEGMENTS*1,H1),
    TOTAL is (2/SEGMENTS)*H1.

sum(SEGMENTS, NR, TOTAL):-
    N1 is (NR-1),
    sum(SEGMENTS, N1, S1),
    f(2/SEGMENTS*NR,H1),
    f(2/SEGMENTS*N1,H2),
    TOTAL is S1 + (2/SEGMENTS)*((H1+H2)/2).
应该用梯形法则或类似的东西来计算半圆面积。 正如我已经告诉你的。。它确实完成了,但在达到基本情况和(段,1,总计)后,它调用具有第二个可选项的函数…:

谢谢大家

还有:这是我运行它时得到的结果

?- sum(3000,3000,TOTAL).
TOTAL = 1.5707983753431007 ;
ERROR: Out of local stack

问题是,回溯将在第一个子句成功后,在第二个
sum
子句上尝试
NR
1
的情况。这会导致一个很长的递归过程(因为每次递归调用的NR都会不断递减,试图通过所有负整数值进行换行,等等)

解决这个问题的一个简单方法是在第二个
sum
子句中。由于意图是针对
NR>1
的情况,因此将
NR>1
作为您的第一句话:

sum(SEGMENTS, NR, TOTAL) :-
    NR > 1,
    N1 is (NR-1),
    sum(SEGMENTS, N1, S1),
    f(2/SEGMENTS*NR,H1),
    f(2/SEGMENTS*N1,H2),
    TOTAL is S1 + (2/SEGMENTS)*((H1+H2)/2).

还要注意,表达式
f(2/SEGMENTS*NR,H1)
不会计算表达式
2/SEGMENTS*NR
并将其传递给
f
。它实际上象征性地传递了这个表达。它恰好在这里起作用,因为
f
is/2
的右侧包含它,所以它会根据需要进行评估。如果你追踪它,你就会明白我的意思。

非常感谢!是的。。当我追踪它时,我注意到了。。我试图避免使用IF子句:)mbrach,请将您的回答添加为答案,这样我可以将此标记为已回答,并为您提供积分:)谢谢@p.chang。我补充了一个答案。