Function Haskell-尝试创建一个函数来查找奇数的阶乘 fact::Int->Int 事实 |n0&&n`mod`2==1=事实(n-1)*n |n>0&&n`mod`2==0=n-1

Function Haskell-尝试创建一个函数来查找奇数的阶乘 fact::Int->Int 事实 |n0&&n`mod`2==1=事实(n-1)*n |n>0&&n`mod`2==0=n-1,function,haskell,recursion,factorial,Function,Haskell,Recursion,Factorial,当我输入一个奇数时,例如:事实5将给出15,因为它应该是1*3*5=15。然而,我意识到,如果我做事实7或任何其他奇数,它只乘以前两个奇数。我怎样才能得到一个函数,将所有奇数相乘,而不仅仅是前2个。事实7=35(即3*5)。还要注意的是,如果输入偶数,它将计算出所有奇数的阶乘,直到且不包括偶数 你的问题是,偶数的情况是n-1,这意味着当你得到一个奇数时,你实际上只是在做 fact :: Int -> Int fact n |n < 0 = 0 |n == 0 = 1

当我输入一个奇数时,例如:事实5将给出15,因为它应该是1*3*5=15。然而,我意识到,如果我做事实7或任何其他奇数,它只乘以前两个奇数。我怎样才能得到一个函数,将所有奇数相乘,而不仅仅是前2个。事实7=35(即3*5)。还要注意的是,如果输入偶数,它将计算出所有奇数的阶乘,直到且不包括偶数

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

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
当你想要的是

n*n-2*n-4

所以试试这个吧

n * (n - 1 - 1)
fact::Integer->Integer--溢出
事实
|n<0=0
|n==0 | | n==1=1
|n`mod`2==1=事实(n-2)*n
|n`mod`2==0=事实(n-1)

我还冒昧地删除了一些多余的逻辑。在这里,如果它是奇数,我们会减少2,所以5->3。在偶数的情况下,我们递减1,最后得到一个奇数,然后在奇数上递归。

这让我想起了著名的。解读终身教授的答案:

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)

我认为对于大于1的奇数,它实际上是
fact(n-1)*n其中fact x=x-1
这是
fact(n-1)*n其中fact(n-1)=(n-1)-1
这是
((n-1)-1)*n
这是
n*(n-2)
。我尝试过的所有数字都等于0,这与n-2有关系吗?在我的代码中,当我尝试n-2时,我没有n<0=0,答案变成了否定。@jellybean_232是的,我添加了一个n==1@jellybean_232它在
n==1
的情况下捕获它,这样它就不会在超过它的时候递减2-1@jellybean_232没问题,请随时检查我的答案,将问题标记为已结束
factorialOfOdds :: Integer -> Integer
factorialOfOdds n = product [1,3..n]