我正在尝试学习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
答案 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 = ....