我是初学者。我正在做一个递归程序问题是,即使它打印答案..它在打印答案后不会停止并最终给出“超出本地堆栈”。 我已经读过它可能是一个左递归问题,但是我已经告诉过你我是新手的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
答案 0 :(得分:1)
问题是,在第一个子句成功后,回溯将在第二个NR
子句上尝试1
值sum
的情况。这会导致一个很长的递归过程(因为每次递归调用时,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的右侧,因此可以根据需要进行评估。如果你追踪它,你会明白我的意思。