1
我想在序言中做一個階乘代碼,但得到本地堆棧的錯誤,也就是說,它被卡在無限循環中。我無法理解如何。 這是我的代碼:序言錯誤:在局部堆棧中的因子
fact(0,1).
fact(1,1).
fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z.
我在哪裏出錯了?
我想在序言中做一個階乘代碼,但得到本地堆棧的錯誤,也就是說,它被卡在無限循環中。我無法理解如何。 這是我的代碼:序言錯誤:在局部堆棧中的因子
fact(0,1).
fact(1,1).
fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z.
我在哪裏出錯了?
這是A=X-1
,後來Y=X*Z
。關於Prolog的頂級偉大的事情是,你可以輕鬆地嘗試一下你的代碼做什麼:
?- A = X-1.
A = X-1.
?- A = 5-1.
A = 5-1.
顯然,Prolog是諷刺我們:)。 =
運算符用於統一;如果你想要做算術,你必須使用is/2
:
?- is(A, -(5, 1)).
A = 4.
通常寫爲:
?- A is 5-1.
A = 4.
這只是告訴你,一個表達式是一個術語,並評估了其第二術語參數:
?- Expr = X-1, X = 3, Result is Expr.
Expr = 3-1,
X = 3,
Result = 2.
對於您的factorial定義:它應該工作,如果您修復算術。請注意,如果X
開頭的條件是X > 1
而不是X \== 0
,那麼它會更乾淨:您當前的程序爲fact(1,F)
做了什麼?您獲得了多少個答案?
它的工作原理!非常感謝! – telekineser