程序需要很长时间来计算…….递归(python)

程序需要很长时间来计算…….递归(python),python,recursion,Python,Recursion,我的程序需要很长时间来查找文件中所有的vocab列表,以便打印所有可能创建的单词。 如何通过不使用任何导入使其读取速度更快?顺便说一句,我是python新手:( 例如,我在一个文件中包含超过4000个单词/字母/单词 如果您输入任何字母,它将在该文件中找到所有可能的结果 if the user enter: a c t b 它将显示:(假设4000+个字母/单词中的所有这3个字母/单词都在可以创建的文件中) 这是我的节目 def scramble(r_letters, s_letters):

我的程序需要很长时间来查找文件中所有的vocab列表,以便打印所有可能创建的单词。 如何通过不使用任何导入使其读取速度更快?顺便说一句,我是python新手:( 例如,我在一个文件中包含超过4000个单词/字母/单词 如果您输入任何字母,它将在该文件中找到所有可能的结果

if the user enter: a c t b
它将显示:(假设4000+个字母/单词中的所有这3个字母/单词都在可以创建的文件中)

这是我的节目

def scramble(r_letters, s_letters):
    """
    Output every possible combination of a word.
    Each recursive call moves a letter from
    r_letters (remaining letters) to
    s_letters (scrambled letters)
    """
    if len(r_letters) == 0:  # Base case: All letters used
        words.add(s_letters)
    else:  # Recursive case: For each call to scramble()
           # move a letter from remaining to scrambled
        for i in range(len(r_letters)):
            # Move letter to scrambled
            tmp = r_letters[i]
            r_letters = r_letters[:i] + r_letters[i+1:]
            s_letters += tmp

            scramble(r_letters, s_letters)

            # Put letter back in remaining letters
            r_letters = r_letters[:i] + tmp + r_letters[i:]
            s_letters = s_letters[:-1]
        if s_letters:
             words.add(s_letters)

似乎你想从给定的字母中生成所有可以创建的排列,然后检查这些排列是否对应于某个字典中的任何“真实”单词,就像在拼字游戏中查找可以创建的单词一样

您只需将参数中的字母交换到递归调用,就可以使
加扰
功能更快(并且更短)。这样,您就不必将它们交换回来:

def scramble(r_letters, s_letters):
    if s_letters:
        words.add(s_letters)
    for i in range(len(r_letters)):
        scramble(r_letters[:i] + r_letters[i+1:], s_letters + r_letters[i])
您也可以用于此,例如,像这样,使用给定字母生成不同字长的所有排列:

def scramble2(letters):
    for i in range(1, len(letters) + 1):
        for p in itertools.permutations(letters, i):
            words.add(''.join(p))
根据IPython的
%timeit
,这大约比您的实现快三倍:

In [3]: %timeit test.scramble("test", "")
10000 loops, best of 3: 50.4 µs per loop
In [4]: %timeit test.scramble2("test")
100000 loops, best of 3: 16.7 µs per loop

但是,您根本不需要生成所有排列!只需计算单词中的字母数,并将它们与可用字母数进行比较。您可以使用它,也可以创建自己的计数器式字典

import collections
letters = "abctk"
words = "cat back track tact".split()
letter_counts = collections.Counter(letters)
for word in words:
    word_counts = collections.Counter(word)
    if all(letter_counts.get(c, 0) >= n for c, n in word_counts.iteritems()):
        print word
这将打印
“cat”
“back”

如果您想避免使用库(可以练习,但不要坚持这个习惯),您可以创建自己的计数器,例如:

def count(word):
    d = {}
    for c in word:
        d[c] = d.get(c, 0) + 1
    return d

程序到底应该做什么?从一个文件中获取所有“真实”单词,这些单词可以通过“置乱”一些字母来获得?就像你可以在“置乱”中用字母创建的单词一样?是的。它将尝试显示所有可能的单词(如果这些单词在文件中)这可以从给定的字母创建。以某种方式使用正则表达式,速度会快得多。我不知道这是什么,老实说,不使用任何导入是可能的?这是我的完整代码@Besttee collections,itertools是内置的,高度优化的(用C实现)模块来执行某种操作,这完全符合您的目的。为什么您不想使用它们?因为我正在练习递归,并试图得到实数it@Besttee我理解这一点,并且您的功能可能有一些改进的潜力(还没有过多地研究).不过,我认为首先生成所有排列并不是解决问题的正确方法。
def count(word):
    d = {}
    for c in word:
        d[c] = d.get(c, 0) + 1
    return d