我已经在haskell中编写了一个简单的函数,该函数是非尾递归的,可以对列表中的值求和:
nonTailRecursiveSum :: [Integer] -> Integer
nonTailRecursiveSum [] = 0 --base case
nonTailRecursiveSum (x:xs) = x + sum xs
但是我现在想做的是实现相同的功能,但是使用尾部递归。据我所知,尾递归在最后一步执行递归调用,所以我尝试了类似的事情:
tailRecursiveSum :: [Integer] -> Integer
tailRecursiveSum [] = 0
tailRecursiveSum (x:xs) = aux_f(x) + tailRecursiveSum xs
.
.
但是由于我对Haskell的尾递归不熟悉,我在中途迷路了。有人可以协助我继续执行代码的尾部递归版本吗?
答案 0 :(得分:1)
玩了一下,
sum (x:y:xs) = x + sum (y:xs)
= x + (y + sum xs)
= (x + y) + sum xs
g a b = a + sum b
sum (x:y:xs) = g x (y:xs)
= x + g y xs
= g (x+y) xs -- !!!
最后一个是尾递归形式!因此,我们只需定义
sum xs = g 0 xs
where
g acc [] = ...
g acc (x:xs) = g (acc + ...) ...
填空!