Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 递归中的返回列表_List_Recursion_Prolog_Return - Fatal编程技术网

List 递归中的返回列表

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

其概念是,它将获取列表并将前N个元素递减1,然后将结果列表分配给变量输出。当我写查询时:

proceed(N, [H|T], [Output]) :-
   N > 0, NewN is N - 1, NewH is H - 1,
   proceed(NewN, T, [NewH|Output]).
我希望它“返回”:

我怎样才能做到这一点?我知道我需要一些停止谓词,但想不出一个。
如果有人能提供一个有很好解释的答案,我将不胜感激。

您当前的代码有两个问题:

  • 缺少您已正确识别的base子句,以及
  • 建立输出列表的方式是错误的
现在让我们一个接一个地考虑这两点。粗略地说,您的base子句应该描述不需要进一步处理时发生的情况。具体发生的时间取决于手头的问题:base子句可以描述输入列表为空、一个或多个参数达到特定状态或其他类似情况时发生的情况

在您的例子中,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).