如何在Python中计算双阶乘?

7 投票
11 回答
18201 浏览
提问于 2025-04-16 10:16

我在这个问题上卡了很久。 我已经成功写出了一个单层递归的阶乘。

def factorial(n):
     if n == 0:
         return 1
     else:
         return n * factorial(n-1)

双阶乘 对于一个偶数 n,双阶乘是所有小于或等于 n 的正偶数的乘积。对于一个奇数 p,双阶乘是所有小于或等于 p 的正奇数的乘积。

如果 n 是偶数,那么 n!! = n*(n - 2)*(n - 4)*(n - 6)* ... *4*2

如果 p 是奇数,那么 p!! = p*(p - 2)*(p - 4)*(p - 6)* ... *3*1

但是我不知道怎么做双阶乘。有人能帮帮我吗?

11 个回答

4

这里的问题是,双阶乘在负数上是有定义的,比如说 (-1)!! = 1,(-3)!! = -1(即使是负整数,比如 -2、-4 等,也应该有解,结果是正无穷或负无穷)。所以,所有关于负数的解似乎都有点问题。如果想要为所有实数定义双阶乘,这些解就不适用了。解决办法是使用伽马函数来定义双阶乘。

import scipy.special as sp
from numpy import pi

def dfact(x):
    n = (x + 1.)/2.
    return 2.**n * sp.gamma(n + 0.5)/(pi**(0.5))

这可行!:D

5

这不就是阶乘,只是结束条件和递归调用的参数不同吗?

def doublefactorial(n):
     if n <= 0:
         return 1
     else:
         return n * doublefactorial(n-2)

如果 n 是偶数,那么当 n == 0 时程序会停止。如果 n 是奇数,那么当 n == -1 时程序会停止。

19
from functools import reduce # only in Python 3

reduce(int.__mul__, range(n, 0, -2))

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答