繁体   English   中英

编写一个程序来显示Python中“abcdef”的所有字谜

[英]Write a program to display all the anagrams for “abcdef” in Python

我的朋友写了一个代码来显示python中“abcdef”的所有字谜。 但是在这段代码中,我无法理解递归过程如何工作anagrams = get_list_of_anagrams(''.join(tmp_list))函数如何调用自身?

def get_list_of_anagrams(s):
    if len(s)==0:
        return ['']
    all_chars = list(s)
    unique_chars = list(set(s))
    anagrams_list = []
    for char in unique_chars:
        tmp_list = list(all_chars)
        tmp_list.remove(char)
        anagrams = get_list_of_anagrams(''.join(tmp_list))
        for i in range(len(anagrams)):
            anagrams[i] = char+anagrams[i]
        anagrams_list += anagrams
    return anagrams_list

当我尝试打印所有东西,直到anagrams = get_list_of_anagrams(''.join(tmp_list)

def get_list_of_anagrams(s):
    if len(s)==0:
        return ['']
    all_chars = list(s)
    unique_chars = list(set(s))
    anagrams_list = []
    for char in unique_chars:
        tmp_list = list(all_chars)
        tmp_list.remove(char)
        anagrams = get_list_of_anagrams(''.join(tmp_list))



print get_list_of_anagrams('abc')

我得到以下输出。

在此输入图像描述

对于以下代码:

def get_list_of_anagrams(s):
    if len(s)==0:
        return ['']
    all_chars = list(s)
    unique_chars = list(set(s))
    anagrams_list = []
    for char in unique_chars:
        tmp_list = list(all_chars)
        tmp_list.remove(char)
        anagrams = get_list_of_anagrams(''.join(tmp_list))
        print anagrams
        for i in range(len(anagrams)):
            anagrams[i] = char+anagrams[i]
        anagrams_list += anagrams
    return anagrams_list  

print get_list_of_anagrams('abc')

我得到以下输出:

在此输入图像描述

有人可以解释一下为什么上面的输出是这种模式的吗?

生命是短暂的使用库:

import itertools
d = 'abc'
e = len(d)
j = list()

for p in itertools.permutations(d, e):
    print p

('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

追踪:

def get_list_of_anagrams(s):
    # base case - empty string, return empty
    if len(s)==0:
        return ['']

    # figure out which characters are available
    all_chars    = list(s)       # may have repeats
    unique_chars = list(set(s))  # no repeats

    # prepare to store all results
    anagrams_list = []

    # for each unique character
    for char in unique_chars:
        # remaining unused characters
        tmp_list = list(all_chars)
        tmp_list.remove(char)

        # recurse: get all anagrams of remaining characters
        anagrams = get_list_of_anagrams(''.join(tmp_list))

        # prefix each result with picked character
        for i in range(len(anagrams)):
            anagrams[i] = char+anagrams[i]

        # add to overall results
        anagrams_list += anagrams

    # return all results
    return anagrams_list

我会稍微重写一下,比如

def get_list_of_anagrams(s):
    anagrams = []

    remaining = list(s)
    for char in sorted(set(s)):
        remaining.remove(char)
        if remaining:
            # recurse: get all anagrams of remaining characters
            for anagram in get_list_of_anagrams(remaining):
                # prefix each result with picked character
                anagrams.append(char + anagram)
        else:
            anagrams.append(char)
        remaining.append(char)

    # return all results
    return anagrams

所以要找到get_list_of_anagrams("abcdef") ,你就得到了

"a" + each(get_list_of_anagrams("bcdef"))
"b" + each(get_list_of_anagrams("acdef"))
"c" + each(get_list_of_anagrams("abdef"))
"d" + each(get_list_of_anagrams("abcef"))
"e" + each(get_list_of_anagrams("abcdf"))
"f" + each(get_list_of_anagrams("abcde"))

等等

这是一个递归函数。 例如着名的斐波那契序列:

def fib(n):
    if n < 2:
        return n
    return fib(n-2) + fib(n-1)
print fib(10)

有关递归的更多信息,请查看此问题

想法是找到'abc'的字谜,首先找到'bc'所有字谜,这是通过首先找到'c'所有字谜来完成'c' ,这是通过首先找到''所有字谜来完成''

那么如何根据“内层”的所有字谜找到“外层”的字谜? 鉴于所有字谜'bc' (这是'bc''cb' ),你可以找到所有字谜'abc'通过插入a进入的每一个位置'bc''cb' 详情如下:

# 'bc' will give these anagrams:
abc # insert 'a' at first position
bac # insert 'a' at second position
bca # insert 'a' at third position (also last)

# Similarly, 'cb' gives:
acb
cab
cba

所以'bc' 2个字谜给你6个'abc'字谜。

===

关于算法:它在每次递归时删除1个字符(使用tmp_list.remove(char) )。 len(s)==0的基本情况下(即当所有字符都被删除时),它只返回'' 然后继续使用上面的逻辑找到'f'的字谜,然后是'ef'的字谜......最后返回abcdef的字谜。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM