Haskell - 尝试创建一个函数来查找奇数的阶乘

时间:2013-11-19 21:13:48

标签: function haskell recursion factorial

fact :: Int -> Int 
fact n
    |n < 0 = 0
    |n == 0 = 1
    |n > 0 && n `mod` 2 == 1 = fact (n-1) * n
    |n > 0 && n `mod` 2 == 0 = n-1

当我输入一个奇数时,例如:事实5将给出15,因为它应该1 * 3 * 5 = 15.但是我意识到如果我做事实7或任何其他奇数,它只会乘以前两个奇数。如何使函数乘以所有奇数而不仅仅是前2个。例如。事实上7 = 35(即3 * 5)。另请注意,如果输入偶数,它将计算出所有奇数的阶乘,直到不包括偶数。

2 个答案:

答案 0 :(得分:4)

这让我想起了着名的Evolution of a Haskell Programmer。解释终身教授的回答:

factorialOfOdds :: Integer -> Integer
factorialOfOdds n = product [1,3..n]

答案 1 :(得分:3)

你的问题是你的偶数是n-1的情况,这意味着当你得到一个奇数时,你真的只是在做

n * (n - 1 - 1)

当你想要的是什么

n * n-2 * n-4 ......

所以试试这个

fact :: Integer -> Integer -- Overflows 
fact n
    |n < 0 = 0
    |n == 0 || n == 1 = 1
    |n `mod` 2 == 1 = fact (n-2) * n
    |n `mod` 2 == 0 = fact (n-1)

我也冒昧地删除了一些冗余逻辑。如果它是奇数,我们减去2,所以5 - &gt; 3.在偶数情况下,我们减1,最后得到一个奇数,然后递归。