List 递归中的返回列表
其概念是,它将获取列表并将前N个元素递减1,然后将结果列表分配给变量输出。当我写查询时:List 递归中的返回列表,list,recursion,prolog,return,List,Recursion,Prolog,Return,其概念是,它将获取列表并将前N个元素递减1,然后将结果列表分配给变量输出。当我写查询时: proceed(N, [H|T], [Output]) :- N > 0, NewN is N - 1, NewH is H - 1, proceed(NewN, T, [NewH|Output]). 我希望它“返回”: 我怎样才能做到这一点?我知道我需要一些停止谓词,但想不出一个。 如果有人能提供一个有很好解释的答案,我将不胜感激。您当前的代码有两个问题: 缺少您已正确识别的base
proceed(N, [H|T], [Output]) :-
N > 0, NewN is N - 1, NewH is H - 1,
proceed(NewN, T, [NewH|Output]).
我希望它“返回”:
我怎样才能做到这一点?我知道我需要一些停止谓词,但想不出一个。
如果有人能提供一个有很好解释的答案,我将不胜感激。您当前的代码有两个问题:
- 缺少您已正确识别的base子句,以及
- 建立输出列表的方式是错误的
N
变为零时发生的情况。答案很简单:当N
为零时,输入列表将复制到输出中,而不做任何更改。因此,您的基本子句是
Answer = [2,1,1].
您还需要处理列表在N
达到零之前元素用完的情况:
proceed(0, L, L).
这也很简单-如果输入列表为空,那么输出也应该为空,而不管N
的值是多少
现在让我们回到你的主要条款。您的代码正确地计算N
的下一个值和head元素,但它不是将它们粘贴到输出中,而是将它们放入递归调用中。以下是更正的版本:
proceed(_, [], []).
现在,NewH
被添加回子句标题中的Output
,确保输出“流回”调用方。这看起来可能违反直觉,但Prolog就是这样工作的
这是一本书 您可以使用“累加器”。在这种情况下,您不需要/不需要累加器。在
继续
谓词中,您希望输出是[NewH | output]
,而不是[output]
,并且输出
是您在对继续
的递归调用中使用的。然后您还需要基本情况来覆盖N
值0
,以及当第二个参数为[]
时会发生什么情况。
proceed(_, [], []).
proceed(N, [H|T], [NewH|Output]) :-
N > 0,
NewN is N - 1,
NewH is H - 1,
proceed(NewN, T, Output).