prolog递归错误(简单)

时间:2013-11-01 21:32:11

标签: 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(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,总数)后,它用第二个替代方法调用函数......:S

谢谢你们!

另外:这是我运行时的结果

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

1 个答案:

答案 0 :(得分:1)

问题是,在第一个子句成功后,回溯将在第二个NR子句上尝试1sum的情况。这会导致一个很长的递归过程(因为每次递归调用时,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的右侧,因此可以根据需要进行评估。如果你追踪它,你会明白我的意思。