2015-04-19 54 views
0

我有以下的Python方程式正確地執行:遞歸式似乎並不在Python

def E(r, b): 
    if r == 0: 
     return 0 
    elif b == 0: 
     return r 
    else: 
     return max(0, (r/(r+b))*[1+E(r-1,b)]+(b/(r+b))*[E(r,b-1)-1]) 

print E(1,1) 

遞歸似乎並沒有工作。對於E(1,1),數學方程應返回1/2。然而,我得到0和E(2,2),我得到一個錯誤,在數學上它應該是2/3。

from __future__ import division 
def E(r, b): 
    if r == 0: 
     return 0 
    elif b == 0: 
     return r 
    else: 
     return max(0, (float(r)/float(r+b))*[1+E(r-1,b)]+(float(b)/float(r+b))*[E(r,b-1)-1]) 

print E(1,1) 

我做了如下調整,但仍然遇到了錯誤:

回答

3

:「類型錯誤無法按類型‘浮動’的非INT繁衍序列」對於Python 2,當你替換R = 1和b = 1時,方程的前部變成:

1/(1+1) = 0 

所以max將總是返回max(0, 0)

@Alik提到from __future__ import division如果需要floating point division

>>> from __future__ import division 
>>> def E(r, b): 
...  if r == 0: 
...   return 0 
...  elif b == 0: 
...   return r 
...  else: 
...   return max(0, (r/(r+b))*(1+E(r-1,b))+(b/(r+b))*(E(r,b-1)-1)) 
... 
>>> print (E(1,1)) 
0.5 
>>> print (E(2,2)) 
0.666666666667 
>>> 
+0

第一部分不應該是1/2? – VMO

+0

你使用的是什麼版本的Python?如果是python2,division將返回一個int。 – DTing

+0

強制變量浮動以獲得浮點除法。 – jwilner

1

的問題是作爲最好的,我可以告訴你正在使用int要使用花車,還我猜您正在使用的方括號作爲替代使用連續兩個括號。 Python是解釋方括號列表,當你通過一個int蟒蛇繁殖列表會返回一個列表與列表

['a', 'b'] * 5 
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b'] 

的許多重複。當你試圖通過一個浮動Python可以乘以清單」處理它,只是返回一個類型錯誤。它看起來像是如果你只是改變整數浮動和替換方括號與parens你應該是好的。

def E(r, b): 
    r = float(r) 
    b = float(b) 
    if r == 0: 
     return 0 
    elif b == 0: 
     return r 
    else: 
     return max(0, (r/(r+b))*(1+E(r-1,b))+(b/(r+b))*(E(r,b-1)-1)) 

print E(1,1)