Haskell中的尾部递归函数

时间:2018-08-05 16:45:52

标签: haskell recursion

我正在尝试学习Haskell,并且阅读了有关尾部递归的信息。例如,我可以这样编写sum函数:

sum :: Num a => [a] -> a
sum [] = 0
sum (x:xs) = x + summe xs

而且也是这种方式

summe':: Num a => [a] -> a
summe' x = iterate x 0
    where
    iterate x y | null x    = 0 + y
                | otherwise = iterate (tail x) (head x + y)

有人可以告诉我如何使用此功能吗?我迷路了

f :: Integer -> Integer
f 0 = 0
f n = n * f (n-1) + n

2 个答案:

答案 0 :(得分:3)

为了使用尾递归重写以下功能:

f :: Integer -> Integer
f 0 = 0
f n = n * f (n-1) + n

可以使用summe'中使用的相同方法。

这个想法是从零开始,然后递增值直到达到n

f :: Integer -> Integer
f n = iterate 0 0
  where
    f' x sum = x * sum + x
    iterate x sum | x == n = f' n sum
                  | otherwise = iterate (x + 1) (f' x sum)

因此,如果达到n,则用n和累积的和求函数;否则,请使用中间的总和和值来计算函数,然后将其传递给下一个迭代。

答案 1 :(得分:2)

好吧,让f n = n * f (n-1) + n翻转n = k + 1中的“时间方向”,我们就有了

f (k+1) = (k+1) * f k + (k+1)
next fk k = (k+1) * fk + (k+1)

因此

f n = iterate 0 0
  where
  iterate k fk | k==n = fk
               | otherwise = ....