2016-11-25 117 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