我写了这个python代码,来自wolfram alpha说它应该返回任何正值的阶乘(我可能搞砸了某个地方),整数与否:
from math import *
def double_factorial(n):
if int(n) == n:
n = int(n)
if [0,1].__contains__(n):
return 1
a = (n&1) + 2
b = 1
while a<=n:
b*=a
a+= 2
return float(b)
else:
return factorials(n/2) * 2**(n/2) *(pi/2)**(.25 *(-1+cos(n * pi)))
def factorials(n):
return pi**(.5 * sin(n*pi)**2) * 2**(-n + .25 * (-1 + cos(2*n*pi))) * double_factorial(2*n)
问题是,比方说我输入pi到小数点后6位。 2 * n不会很快成为一个带有0作为小数的浮点数,因此等式结果为
pi**(.5 * sin(n*pi)**2) * 2**(-n + .25 * (-1 + cos(2*n*pi))) * double_factorial(loop(loop(loop(...)))))
我如何停止递归并仍然得到答案?
我有建议为定义或其他东西添加一个索引,但问题是,如果代码在到达索引时停止,仍然没有答案可以放回到之前的“嵌套”或者你称之为的任何东西
答案 0 :(得分:1)
您根据f
以g
和g
来定义f
。但是你不只是有一个没有基点的循环定义来开始递归。你有更糟糕的事情。 f
的定义实际上是g
倒置的定义。 f
正在撤消g
所做的事情,反之亦然。如果您正在尝试自己实现伽马(即不使用库中已存在的伽玛),那么您需要使用一个表达伽马的公式来表示您知道如何评估的其他内容。只使用一个公式及其反转就像是一种方法,几乎任何你应用它的问题都会失败。
答案 1 :(得分:0)
在您的代码中,您可以定义double_factorial,如
double_factorial(n) = factorial(n/2) * f(n) ... (1)
并在阶乘中将其定义为
factorial(n) = double_factorial(2*n) / f(2*n) ... (2)
等同于等式(1),因此您创建了一个没有出口点的循环引用。即使数学也无济于事。您必须定义factorial或double_factorial,例如
def factorials(n):
return tgamma(n + 1)