递归方程似乎在Python中没有正确执行

时间:2015-04-19 04:03:20

标签: python recursion

我有以下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”

2 个答案:

答案 0 :(得分:3)

对于Python 2,当你用r = 1和b = 1代替时,等式的前面部分变为:

1 / (1+1) = 0

因此max将始终返回max(0, 0)

如果您需要floating point division

@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)