递归混淆 - 杆切割算法

时间:2014-01-06 18:29:50

标签: python algorithm

我正在尝试实施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.是否有一般方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

您的递归rod_cutting_memoization_aux()函数仅返回r[n] is not Nonen == 0的值。如果这两个条件都不是True,那么该函数只会在没有明确return的情况下结束,这意味着会返回None

这意味着该行:

q = max(q, p[i] + rod_cutting_memoization_aux(p,n-i-1,r))
对于p[i]的某些值,

会尝试将Nonep, n - i - 1, r相加。

您需要从递归调用中返回None 之外的其他内容以防止此情况发生;可能需要返回一个整数。