用于切割杆概率集的递归树

时间:2016-03-12 01:46:15

标签: python memory recursion dynamic

我对切割杆有一个递归的解决方案(动态问题)。问题描述为here。 如果运行此代码,您会注意到当外部for循环迭代时,递归函数不会再次运行(请参阅' i'不会再次打印0和1)。我想知道Python是否记忆上一次迭代的递归结果?我认为每次迭代我都必须进行递归调用,但它看起来并不像。

def cutRod(n, prices):
    if n <= 1:
        return prices[0]
    max_val = 0
    for i in range(n):
        print i, max_val
        max_val = max(max_val, prices[i] + cutRod(n-i-1, prices))
        print max_val
    return max_val

prices = [2,5,3]
n = len(prices)
print cutRod(n,prices)

1 个答案:

答案 0 :(得分:1)

除了将if n <= 1:的第2行更改为if n == 1:之外,您的代码几乎是正确的,这样max_val = max(max_val, prices[i] + cutRod(n-i-1, prices))时行i = n-1才能正常工作。修改完成后,如果i = n-1,我们在修改之前会cutRod(n-i-1, prices) = cutRod(n-(n-1)-1, price)) = cutRod(0, price) = 0而不是cutRod(0, price) = prices[0]。实际上,递归函数在代码中再次运行,并且可以记忆上一次迭代中的max_value