我有以下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)
我进行了以下调整,但仍然遇到错误:“TypeError:不能将序列乘以'浮动'类型的非int”
答案 0 :(得分:3)
对于Python 2,当你用r = 1和b = 1代替时,等式的前面部分变为:
1 / (1+1) = 0
因此max
将始终返回max(0, 0)
@Alik会提到from __future__ import 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
>>>
答案 1 :(得分:1)
问题是尽可能地告诉您使用了要使用浮点数的int,我还猜测您使用方括号作为连续使用两个括号的替代方法。 Python将方括号解释为一个列表,当你将一个列表乘以一个int python时,将返回一个包含列表重复次数的列表
['a', 'b'] * 5
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
当你试图将列表乘以浮点时,python无法处理它,只返回一个类型错误。看起来如果你只是将int更改为浮点数并用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)