我正在尝试实施CLRS中说明的杆切割算法,但我发现自己很难让索引正确。这是我对memoization版本的实现:
import sys
def rod_cutting_memoization(p,n):
r = [None for i in range(n+1)]
r[0] = 0
rod_cutting_memoization_aux(p,n,r)
return r
def rod_cutting_memoization_aux(p,n,r):
print r
if r[n] is not None:
return r[n]
if n is 0:
return 0
else:
q = -100
for i in range(n):
q = max(q, p[i] + rod_cutting_memoization_aux(p,n-i-1,r))
r[n] = q
p=[1, 5, 8, 9, 10, 17, 17, 20, 24, 30]
n = int(sys.argv[1])
print rod_cutting_memoization(p,n)
从n = 2开始,代码表示int + None。本书中的伪代码是用从1开始的索引编写的。我总是有这个问题,转换算法的索引从1到0.是否有一般方法来解决这个问题?
答案 0 :(得分:3)
您的递归rod_cutting_memoization_aux()
函数仅返回r[n] is not None
和n == 0
的值。如果这两个条件都不是True
,那么该函数只会在没有明确return
的情况下结束,这意味着会返回None
。
这意味着该行:
q = max(q, p[i] + rod_cutting_memoization_aux(p,n-i-1,r))
对于p[i]
的某些值,会尝试将None
与p, n - i - 1, r
相加。
您需要从递归调用中返回除None
之外的其他内容以防止此情况发生;可能需要返回一个整数。