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)。另请注意,如果输入偶数,它将计算出所有奇数的阶乘,直到不包括偶数。
答案 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,最后得到一个奇数,然后递归。