2016-11-25 71 views
0

我試圖讓一個字謎算法,但我卡住了一次,我到了遞歸部分。讓我知道是否需要更多信息。Python - 遞歸單詞列表

我的代碼:

def ana_words(words, letter_count): 
    """Return all the anagrams using the given letters and allowed words. 

    - letter_count has 26 keys (one per lowercase letter), 
     and each value is a non-negative integer. 

    @type words: list[str] 
    @type letter_count: dict[str, int] 
    @rtype: list[str] 
    """ 
    anagrams_list = [] 
    if not letter_count: 
     return [""] 

    for word in words: 
     if not _within_letter_count(word, letter_count): 
      continue 

     new_letter_count = dict(letter_count) 

     for char in word: 
      new_letter_count[char] -= 1 

     # recursive function 
     var1 = ana_words(words[1:], new_letter_count) 

     sorted_word = ''.join(word) 

     for i in var1: 
      sorted_word = ''.join([word, i]) 

     anagrams_list.append(sorted_word) 

    return anagrams_list 

詞是從一個文件中的單詞列表,字母數是一個字符(小寫的話)的字典。單詞中的單詞列表也已經小寫。

輸入:打印ana_words( '宿舍')

輸出我得到:我想

['dirtyroom', 'dotoi', 'doori', 'dormitory', 'drytoori', 'itorod', 'ortoidry', 'rodtoi', 'roomidry', 'rootidry', 'torodi'] 

輸出:

['dirty room', 'dormitory', 'room dirty'] 

鏈接字列表:https://1drv.ms/t/s!AlfWKzBlwHQKbPj9P_pyKdmPwpg

+0

是否需要(或意志)編寫遞歸的東西?因爲它對你的目標確實是違反直覺的。 –

+0

@Rightleg我想用遞歸來做,因爲我正在學習遞歸。 – Theo

+0

'打印字謎('宿舍')'如何知道'髒,宿舍,房間'? –

回答

0

不知道你的單詞列表很難說爲什麼它包括'錯誤'的條目。試用

words = ['room','dirty','dormitory'] 

返回正確的條目。

,如果你想你需要更改單詞之間的空格

sorted_word = ''.join([word, i]) 

sorted_word = ' '.join([word, i]) 

(注增加的空間)

順便說一句,如果你想解決這個問題問題更有效,然後使用'trie'數據結構來存儲單詞可以幫助(https://en.wikipedia.org/wiki/Trie

+0

我已經上傳了這個詞的鏈接,同時也感謝你的空間。 https://1drv.ms/t/s!AlfWKzBlwHQKbPj9P_pyKdmPwpg – Theo

0

問題的錯誤:你是說

詞是從一個文件中的單詞列表,字母數是字符的字典(已經在較低的情況下)。單詞中的單詞列表也已經小寫。

但你實際上是在調用該函數以不同的方式:

print ana_words('dormitory')

這是不對的。

檢查,如果字典值都爲0:

if not letter_count:不會做你所期望的。要檢查字典是否全部爲0,您應該首先獲取值if not any(letter_count.values()):,檢查它們中的任何一個是否與0不同,然後否定答案。

連詞:

str.join(arg1)方法是不適合加入2個字,是加入一個迭代中的String ARG1過去了,在你的情況下,字符串是字符的迭代,你是通過什麼加盟所以結果是相同的單詞。

''.join('Hello') 
>>> 'Hello' 

你使用它的迭代第二次是列表,並將它加入與每個VAR1的元素,實際上是使多數民衆贊成罰款不包括你錯過這裏的空間單詞列表的單詞。問題是你沒有對sorted_words做任何事情。你只是在最後一次使用它。 anagram_list.append(sorted_word)應該在循環中,並且sorted_word = ''.join(word)應該被刪除。

其他錯誤:

所有這樣的錯誤

除此之外,你永遠不會檢查是否信計數到達0停止遞歸。

+0

單詞是單詞列表,而不是字符,'['dorm','hello'...]'。當我用文字說話時,我打電話給每個單詞,所以在這個例子中單詞[0]是'宿舍'。您在new_letter_count上使用遞歸。對於每個單詞,如果char是單詞,則new_letter_count的鍵值減1。讓我知道這是否合理。 – Theo

+0

@他們的話應該像你說的那樣,但是在你的問題中你指定了'print(ana_words('dormitory'))'錯誤是什麼。這正是我試圖解釋的。我會編輯我的答案。 – Adirio