2

我正在尝试使用高阶函数重新创建阶乘函数,例如 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

4 回答 4

2

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

fold f a [] = a

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

于 2013-11-02T02:24:30.567 回答
1

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

fact n = foldl1 (*) [1..n]
于 2017-05-15T10:44:28.907 回答
1

那这个呢?

fac n=product [1..n]
于 2017-05-15T11:00:47.473 回答
0

您将所有阶乘值生成为列表。

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

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

factN n = facts !! n + 1

λ> factN 6
720
于 2017-05-15T06:40:56.253 回答