[英]Return list in recursion
proceed(N, [H|T], [Output]) :-
N > 0, NewN is N - 1, NewH is H - 1,
proceed(NewN, T, [NewH|Output]).
其概念是將列表取前N個元素減1,然后將結果列表分配給變量Output。 例如。 當我寫查詢時:
?-proceed(2, [3,2,1], Answer)
我希望它“返回”:
Answer = [2,1,1].
我該如何實現? 我知道我需要一些停止謂詞,但是想不到一個。 如果有人可以提供一個很好的解釋答案,我將不勝感激。
您當前的代碼有兩個問題:
現在讓我們一一考慮這兩點。 松散地說,您的基本子句應描述不需要進一步處理時發生的情況。 何時確切發生這種情況取決於當前的問題:基本子句可以描述當輸入列表為空,一個或多個參數達到特定狀態或另一類似情況時發生的情況。
在您的情況下,基本子句需要描述當N
變為零時發生的情況。 答案很簡單:當N
為零時,將輸入列表復制到輸出中而無需更改。 因此,您的基本子句是
proceed(0, L, L).
當列表在N
達到零之前用完元素時,您還需要處理這種情況:
proceed(_, [], []).
這也很簡單-如果輸入列表為空,則無論N
的值如何,輸出也應該為空。
現在讓我們回到您的主要條款。 您的代碼可以正確計算N
的下一個值和head元素,但不是將其粘貼到輸出中,而是將它們放入遞歸調用中。 這是更正的版本:
proceed(N, [H|T], [NewH|Output]) :-
N > 0,
NewN is N - 1,
NewH is H - 1,
proceed(NewN, T, Output).
現在,將NewH
添加回該子句標題中的Output
,以確保輸出“流回”到調用者。 這可能看起來違反直覺,但這是Prolog的工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.