Recursion prolog递归错误(简单)
我不熟悉序言。我在做一个递归程序问题是即使它打印出答案。。打印答案后,它不会停止,最终会给出“本地堆栈外”。 我已经读到它可能是一个左递归问题,但正如我已经告诉你们的,我对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
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。我补充了一个答案。