List 递归地在列表中添加值并返回部分和
我有一个清单[1,2,3,4]。我的函数应该返回[1,3,6,10]。这就是我目前所拥有的。我尝试创建一个helper方法,该方法接受该值并将其保存到列表中并添加它。但它似乎不起作用List 递归地在列表中添加值并返回部分和,list,haskell,recursion,List,Haskell,Recursion,我有一个清单[1,2,3,4]。我的函数应该返回[1,3,6,10]。这就是我目前所拥有的。我尝试创建一个helper方法,该方法接受该值并将其保存到列表中并添加它。但它似乎不起作用 summed = [] help x = (x + summed x) : summed summing [] = [] summing (x:xs) = help x : summing xs 不是一个完整的答案,因为这听起来像是家庭作业。但有几种方法 你在正确的轨道上。如果要编写一个包含两个参数的
summed = []
help x = (x + summed x) : summed
summing [] = []
summing (x:xs) = help x : summing xs
不是一个完整的答案,因为这听起来像是家庭作业。但有几种方法 你在正确的轨道上。如果要编写一个包含两个参数的函数:到目前为止的总和和输入列表。如果将列表的
尾部
传递给下一次迭代,则要添加到累加和中的数字将是传递的列表的头部
您还可以查看
Data.List
中的高阶函数,其中一个函数将函数(+)
、初始值和列表作为其参数,并将函数的重复应用程序返回到列表的每个元素,然后返回结果列表,而不仅仅是最终结果。你所做的是一个重要的学习模式。不是一个完整的答案,因为这听起来像是家庭作业。但有几种方法
你在正确的轨道上。如果要编写一个包含两个参数的函数:到目前为止的总和和输入列表。如果将列表的尾部
传递给下一次迭代,则要添加到累加和中的数字将是传递的列表的头部
您还可以查看
Data.List
中的高阶函数,其中一个函数将函数(+)
、初始值和列表作为其参数,并将函数的重复应用程序返回到列表的每个元素,然后返回结果列表,而不仅仅是最终结果。你所做的是一个重要的学习模式。scanl(+)0你的列表应该能做到这一点。通过查阅GHC的标准库文档和资源,您可以了解它是如何实现的以及为什么实现的 scanl(+)0您的列表应该可以这样做。通过查阅GHC的标准库文档和资源,您可以了解它是如何实现的以及为什么实现的 必须递归执行。scanl(+)0
将在结果数组的前面添加0
scanl1(+)
将修复它。@4castle但这使用的是更高阶的函数。我必须递归地执行。@RandomCoder是对的,但你可以检查这些函数的源代码以得到递归的。@RandomCoder这就是为什么我建议你“通过查看GHC的标准库文档和源代码来了解它的实现方式和原因。”scanl
是递归编写的。您所要做的就是读取它。它必须递归执行。scanl(+)0
将把0
添加到结果数组的前面scanl1(+)
将修复它。@4castle但这使用的是更高阶的函数。我必须递归地执行。@RandomCoder是对的,但你可以检查这些函数的源代码以得到递归的。@RandomCoder这就是为什么我建议你“通过查看GHC的标准库文档和源代码来了解它的实现方式和原因。”scanl
是递归编写的。你所要做的就是阅读它。但是我如何保持这个列表和目前为止的总数呢。我对此感到困惑。到目前为止,总和将是被推到函数重复应用结果列表中的最后一个数字,对吗?@AdamSmith-yes。但是我很难添加它并将其发送回去。@RandomCoder上面的提示建议您尝试对xs=helper xs initialValue进行求和,然后递归定义helper xs v
,在xs
上执行明显的情况。在递归调用中,可以使用helper ys next\u v
,以便传递新值v
。通过这种方式,您可以使v
成为迄今为止看到的值的总和。首先,如果你按照原来的方式做,你不需要保留一份清单。运行的总和和输入列表的标题是足够的信息,可以计算列表中的每个新项x'
,您可以返回x':(总和x'xs)
。第二,您可以将输出列表作为一个累加参数,尽管对于列表,只有按相反的顺序构建它才有效。(当您尝试向一个节点只能复制而不能更改的不可变列表的尾部添加某些内容时会发生什么情况?您需要对前一个节点做什么,然后对前一个节点做什么?)。我对此感到困惑。到目前为止,总和将是被推到函数重复应用结果列表中的最后一个数字,对吗?@AdamSmith-yes。但是我很难添加它并将其发送回去。@RandomCoder上面的提示建议您尝试对xs=helper xs initialValue进行求和,然后递归定义helper xs v
,在xs
上执行明显的情况。在递归调用中,可以使用helper ys next\u v
,以便传递新值v
。通过这种方式,您可以使v
成为迄今为止看到的值的总和。首先,如果你按照原来的方式做,你不需要保留一份清单。运行的总和和输入列表的标题是足够的信息,可以计算列表中的每个新项x'
,您可以返回x':(总和x'xs)
。第二,您可以将输出列表作为一个累加参数,尽管对于列表,只有按相反的顺序构建它才有效。(当您尝试向其节点只能复制而不能更改的不可变列表的尾部添加某些内容时,会发生什么情况?您需要对前一个节点做什么,然后对前一个节点做什么?)