如何在Python中计算双阶乘?
我在这个问题上卡了很久。 我已经成功写出了一个单层递归的阶乘。
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))
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。