簡體   English   中英

序言遞歸錯誤(簡單)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM