2017-02-18 26 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)打電話價格訪問值。 價格這是一個字典,不是可調用的。