2017-02-18 60 views
1

这就是我的代码:查找乘船的成本最低,使用递归和缓存

def O_C(n, prices, start=1, memo=None): 
    if start == n: 
     return 0 
    if memo is None: 
     memo = {} 
    if start not in memo: 
     options = [] 
     for i in range(start + 1, n + 1): 
      options.append(prices(start, i) + O_C(n, prices, i, memo)) 
     memo[start] = min(options) 
    return memo[start] 

# O_C stands for Optimal Cost 

def make_random_prices(N): 
    import random 
    prices = {} 
    for i in range(1, N + 1): 
     for j in range(i + 1, N + 1): 
      prices[(i, j)] = random.randint(1, 10*N) 
    return prices 

prices = make_random_prices(100) 
print O_C(100, prices) 

错误我一直不断地得到:

Traceback (most recent call last): 
    File "/Users/Ori/Desktop/OneDrive - mail.tau.ac.il/Python/test/recursion.py", line 48, in <module> 
    print O_C(100, prices) 
    File "/Users/Ori/Desktop/OneDrive - mail.tau.ac.il/Python/test/recursion.py", line 32, in O_C 
    options.append(prices(start, i) + O_C(n, prices, i, memo)) 
TypeError: 'dict' object is not callable 

上找不到这个网站的任何引用,也不在任何其他,在这种情况下,这个错误。 递归调用可能是错误的?

+1

你期待'价格(开始,我)'做什么?你的意思是[价格[(start,i)]',就像你在'make_random_prices'中做的那样? – jonrsharpe

+0

你不应该使用价格[(开始,我)]'而不是价格(开始,我)? – Fallen

+0

错误消息是不言自明的。你正试图调用一个'dict'类型的对象。您可以看到“价格”是一个“字典”,您将其定义为“价格= {}”。然后,在'O_C'中,您尝试调用它:'prices(start,i)',但'dict'类型不可调用。 –

回答

0

这个错误很好地解释了它自己。在下面的代码行,

options.append(prices(start, i) + O_C(n, prices, i, memo)) 

使用prices[(start, i)]价格由元组(start, i),而不是试图通过键入到prices(start, i)打电话价格访问值。 价格这是一个字典,不是可调用的。