我对切割杆有一个递归的解决方案(动态问题)。问题描述为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)
答案 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
。