2010-04-30 50 views
1

我寫了這個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

也許提供一個指向你所指的Wolfram Alpha頁面的鏈接? – 2010-04-30 20:33:33

+0

只需前往wolframalpha.com並輸入,例如pi!它會給你7.1880827289760327020821943451247587185593017639684371624100 ... – calccrypto 2010-04-30 20:52:31

回答

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) 
+0

我想盡可能多...所以如何做wolfram阿爾法呢? – calccrypto 2010-04-30 20:33:15

+0

@calccrypto:Wolfram Alpha基於Mathematica,它可以象徵性地解決方程式。您無法直接在Python中使用Mathematica技術。 – kennytm 2010-04-30 20:37:12

1

您在gg方面在f來定義f。但是你不只是有一個沒有基點的循環定義來開始遞歸。你有更糟糕的事情。 f的定義實際上是g的定義倒置。 f恰恰取消了g所做的,反之亦然。如果你試圖自己實現伽馬(即不使用庫中已有的伽馬),那麼你需要使用一個公式來表達伽瑪,用你知道如何評估的其他東西來表示伽馬。只需使用一個公式及其倒置就是一種方法,幾乎​​可以應用於任何問題。

+0

即時通訊不想做gamma。雙因子是:輸入n。將每個其他值乘以2或3,具體取決於值是偶數還是奇數 – calccrypto 2010-04-30 20:31:50

+0

如果您要爲任意實數計算雙因數,則可以有效計算伽馬。 (http://en.wikipedia.org/wiki/Gamma_function#Properties)你期望通過哪些論據?任何浮點值?這不符合你對每個其他值相乘的描述,因爲偶數或奇數不適用於不是整數的實數。 如果你想使用伽瑪方式給出的公式,並且想自己實現gamma,那麼libm的源代碼中就有代碼。 – sigfpe 2010-04-30 20:37:54