2013-11-26 52 views
1

我對任何高級語言都沒有經驗。當我還是個孩子的時候,用基本的和批處理的方式擺弄。查找拼字的值

我試圖在拼字遊戲中找到單詞的點值。這種遞歸結構看起來很慢並且效率低下。在程序結構/概念方面解決這個問題的更好方法是什麼?

value_list = {'a': 1, 'b': 3, 'c': 3, 'd': 2, 'e': 1, 'f': 4, 'g': 2, 
       'h': 4, 'i': 1, 'j': 8, 'k': 5, 'l': 1, 'm': 3, 'n': 1, 
       'o': 1, 'p': 3, 'q': 10, 'r': 1, 's': 1, 't': 1, 'u': 1, 
       'v': 4, 'w': 4, 'x': 8, 'y': 4, 'z': 10} 

word_index = 0 
total = 0 

def find_value(word): 
    global word_index 
    global total 
    x = word[word_index] 
    total = total + value_list[x] 
    if len(word) > word_index + 1: 
     word_index = word_index + 1 
     find_value(word) 
+0

我刪除了'快譯通()'調用,這是完全多餘的。 –

回答

5

你最好遍歷word直接使用sum()

def find_value(word): 
    return sum(value_list[char] for char in word) 

沒有必要在這裏使用遞歸;上面也不需要全局變量。儘量避免全局狀態,因爲當你在多個位置開始使用函數時,容易導致難以調試的問題。

+1

基督,那很快。謝謝,我明白這是如此的優越。 – user3037525

+0

有點偏題;你能舉一個遞歸的例子來比這種方式繪製數值更好嗎?鑑於你可以做出這樣的陳述,這看起來完全沒有必要,而且相當多的開銷。我只問,因爲我給的練習就是用這種方式解決這個問題,對我來說似乎很麻煩。 – user3037525

+0

當您遇到一個分治策略最容易解決的問題時,遞歸很有用;將工作分成較小的位並將相同的功能應用於這些位,直到您有足夠小的位數以使答案几乎不言而喻。 –

1

首先,您可以用值,而不是dictlist,只是計算指數爲信x在此listord(x) - ord('a')

其次,不要用global,這是一個不好的編程習慣。你應該在局部變量中累加你的值,然後從函數中獲得這個值。

第三,使用循環代替遞歸或更好的功能,如sum

+0

我可以看到在更大的程序中如何使用全局變得混亂。是否有另一個原因應該避免,或者僅僅爲了簡單? – user3037525

+0

這裏的字典實際上比較簡單,因爲列表需要先將每個字符轉換爲整數索引。 'ord(x) - ord('a')'的成本高於字典哈希計算(純C)。 –

0

def find_value(word):

return sum(map(lambda x:value_list[x], list(word))) 


-1

是的,函數調用是昂貴的是Python。

Martijn Pieters的方法是初學者瞭解list-comprehensions的好例子。

如果你想要一個更簡單和可讀的方式,試試這個:

sum(value_list.values()) 
+0

這並不總和一個特定的單詞,只是所有拼貼的所有拼字花費。 –