haskell:使用高阶函数的阶乘

时间:2013-11-02 02:16:01

标签: haskell

我正在尝试通过使用高阶函数来重建一个阶乘函数,例如fac 1 = 1,fac 2 = 2,fac 3 = 6,但我没有太多运气。无论我给出什么输入,我的fold函数都会返回空列表。任何人都可以帮助我吗?

这是我到目前为止所拥有的:

fold f a [] = []
fold f a (x:xs) = fold f (f a x) xs


fac n = fold (*) 1 [1..n]

4 个答案:

答案 0 :(得分:2)

fold返回空列表,因为它的基本情况返回空列表,递归步骤永远不会对递归结果做任何事情。显然,这些事情中至少有一个需要改变,在这种情况下,这应该是基本情况:

fold f a [] = a

或者,您可以使用foldl本身,而不是尝试重新实现它。

答案 1 :(得分:0)

您将所有因子值生成为列表。

facts = scanl (*) 1 [1 ..]

之后获取一个值只是访问列表。

factN n = facts !! n + 1

λ> factN 6
720

答案 2 :(得分:0)

通过折叠列表,您可以实现它:

fact n = foldl1 (*) [1..n]

答案 3 :(得分:0)

这个怎么样?

fac n=product [1..n]