如何在Prolog中編寫一個程序來使用遞歸打印1到10的數字?您如何在Prolog中編寫一個程序來使用遞歸來打印從1到10的數字?
我試過以下,但它不起作用,你能告訴我爲什麼嗎?
print_numbers(10) :- write(10).
print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X).
如何在Prolog中編寫一個程序來使用遞歸打印1到10的數字?您如何在Prolog中編寫一個程序來使用遞歸來打印從1到10的數字?
我試過以下,但它不起作用,你能告訴我爲什麼嗎?
print_numbers(10) :- write(10).
print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X).
去過,因爲我寫的任何一個序言嚴重很長時間,但我可能會做的事情只是有點不同。像這樣的東西,雖然我不能在這個地方測試它。
print_increasing_numbers(From, To):- From > To, !, write('ERROR: From > To').
print_increasing_numbers(To, To):- !, write(To).
print_increasing_numbers(From, To):- write(From),
nl,
Next is From + 1,
print_increasing_numbers(Next, To).
這裏的一個關鍵區別是!
或切斷操作,它會停止回溯。如果您不包含它,那麼當X
爲10時,您將得到第一個子句的解決方案,但如果您要求第二個解決方案,它將回溯並匹配第二個子句。這會導致比您想要的更大的數字列表。
您的代碼非常接近工作。問題是你不能重用X,一旦它被實例化,它就不能被改變(更多細節見here)。使用一個新的變量,就像這樣:(!)
print_numbers(10) :- write(10), !.
print_numbers(X) :- write(X), nl, Next is X + 1, print_numbers(Next).
添加切到年底將防止從翻譯詢問如果你想看到更多的結果。
?- print_numbers(1).
1
2
3
4
5
6
7
8
9
10
Yes
?-
只是想補充一點。如果其回溯,可以使用重用變量。所以如果你有一個未初始化的值,並且初始化它以獲得一個值並且它回溯,它將會轉到它未初始化的原始形式,然後當它嘗試另一個答案時它會再次初始化。有點像如果你有測試(1)。試驗(2)。試驗(3)。並輸入test(X)。到控制檯它會給你1,2和3,因爲回溯。 – Matt 2010-10-18 04:15:38
print_from_1_to_10 :-
print_from_X_to_10(1).
print_from_X_to_10(X) :-
(
X > 10
->
fail
;
writeln(X),
NewX is X + 1,
print_from_X_to_10(NewX)
).
MMMMMM,我想,和它不工作,它打印「 ERROR:>/2:參數不能充分地實例化 例外:(7)print_increasing_numbers(_G272 + 1, _G305)?蠕變 「 – dasen 2010-10-13 19:48:08
-1不測試您的代碼和不評估」X + 1「 – Kaarel 2010-10-13 22:25:37
@Kaarel:謝謝。已經忘記了序言的行爲方面。有了這個修復,並記住將X和Y重命名爲From和To,它運行良好。 – torak 2010-10-14 00:52:30