[英]prolog recursive error (easy)
我是新手。 我正在做一個遞歸程序,問題是,即使它打印出答案,也不會在打印答案后停止並最終給出“ Out of local stack”。 我已經讀過它可能是一個左遞歸問題,但是正如我已經告訴過你的那樣,我是新手,我不十分了解發生了什么...所以..這是代碼。
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
問題在於,在第一個子句成功之后,回溯將在第二個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
的右側,因此可以根據需要對其進行評估。 如果您跟蹤它,您將明白我的意思。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.