递归返回列表

时间:2013-12-31 14:19:46

标签: list recursion prolog return

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

我怎样æ‰èƒ½åšåˆ°è¿™ä¸€ç‚¹ï¼Ÿæˆ‘知é“我需è¦ä¸€äº›åœæ­¢è°“è¯ï¼Œä½†æƒ³ä¸åˆ°ä¸€ä¸ªã€‚ 如果有人能æ供一个好的解释答案,我将ä¸èƒœæ„Ÿæ¿€ã€‚

1 个答案:

答案 0 :(得分:0)

您当å‰çš„代ç å­˜åœ¨ä¸¤ä¸ªé—®é¢˜ï¼š

  • 缺少您已正确识别的基本å­å¥ï¼Œ
  • 构建输出列表的方å¼æ˜¯é”™è¯¯çš„。

现在让我们é€ä¸€è€ƒè™‘这两点。简而言之,您的基本å­å¥åº”æ述在ä¸éœ€è¦è¿›ä¸€æ­¥å¤„ç†æ—¶ä¼šå‘生什么。如果å‘生这ç§æƒ…况å–决于手头的问题:基本å­å¥å¯ä»¥æ述当输入列表为空,一个或多个å‚数达到特定状æ€æˆ–其他类似情况时会å‘生什么。

在您的情况下,基本å­å¥éœ€è¦æè¿°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的工作原ç†ã€‚

这是demo on ideone。

相关问题