SML:prefixSum 使用 addToEach 方法
SML: prefixSum using addToEach method
我正在努力解决这个问题,因为我不确定如何递归地实现它(我可以强制执行)。
列表 l 的前缀和是列表 s,其中 s 的第 i 个索引元素是 l 的前 i + 1 个元素的总和。
我必须使用 addToEach 函数,我写的如下:
fun addToEach(number : int, nil : int list) : int list = nil
| addToEach(number : int, x::y : int list) =
(x + number)::addToEach(number, y);
我想做的是遍历列表 l,假设我在索引 j 处,将索引 j 处的数字添加到列表 s 中的所有元素 0 - (j-1)。不过,不太确定如何递归执行此操作。
感谢您的帮助!
将给定索引处的数字添加到列表的其余部分(索引 j+1,j+2,... 而不是 0,...,j-1)的要点:
fun prefixSum [] = []
| prefixSum (x::xs) = x::addToEach(x, prefixSum xs);
这里有一个不用 addToEach
的方法,它使用尾递归辅助函数:
fun prefixSum' (sums, []) = sums
| prefixSum' ([], x::xs) = prefixSum' ([x],xs)
| prefixSum' (y::ys, x::xs) = prefixSum' ((x+y)::y::ys,xs);
例如,prefixSum' [2,3,4,5] = [14,9,5,2]
——这是向后的(当您使用尾递归函数构建列表时的常见问题)。所以——只需在主函数中反转它:
fun prefixSum xs = rev (prefixSum'([],xs));
我正在努力解决这个问题,因为我不确定如何递归地实现它(我可以强制执行)。
列表 l 的前缀和是列表 s,其中 s 的第 i 个索引元素是 l 的前 i + 1 个元素的总和。
我必须使用 addToEach 函数,我写的如下:
fun addToEach(number : int, nil : int list) : int list = nil
| addToEach(number : int, x::y : int list) =
(x + number)::addToEach(number, y);
我想做的是遍历列表 l,假设我在索引 j 处,将索引 j 处的数字添加到列表 s 中的所有元素 0 - (j-1)。不过,不太确定如何递归执行此操作。
感谢您的帮助!
将给定索引处的数字添加到列表的其余部分(索引 j+1,j+2,... 而不是 0,...,j-1)的要点:
fun prefixSum [] = []
| prefixSum (x::xs) = x::addToEach(x, prefixSum xs);
这里有一个不用 addToEach
的方法,它使用尾递归辅助函数:
fun prefixSum' (sums, []) = sums
| prefixSum' ([], x::xs) = prefixSum' ([x],xs)
| prefixSum' (y::ys, x::xs) = prefixSum' ((x+y)::y::ys,xs);
例如,prefixSum' [2,3,4,5] = [14,9,5,2]
——这是向后的(当您使用尾递归函数构建列表时的常见问题)。所以——只需在主函数中反转它:
fun prefixSum xs = rev (prefixSum'([],xs));