簡體   English   中英

遞歸返回列表

[英]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的工作方式。

這是有關ideone演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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