Python - 递归字谜函数

Posted

技术标签:

【中文标题】Python - 递归字谜函数【英文标题】:Python - Recursive anagram function 【发布时间】:2019-02-06 01:36:07 【问题描述】:

我正在做家庭作业,有点卡住了,请帮忙。

我不希望将答案交给我,但如果我能得到一些帮助或提示,我将不胜感激。

我必须创建一个只进行 1 次递归函数调用且没有 for 循环的字谜生成器。

def anagram(st): 
if len(st) == 0:
    return []
else:
    if len(st) > 1:
        print(st)
        return [st] + [st[0]] + anagram(st[1:])
    else:
        print("test2",st)
        return [st[1:] + st[0]]

ana = anagram('abc') 

这是我的结果:['abc', 'a', 'bc', 'b', 'c'] 5

答案应该是:['abc', 'acb', 'bac', 'bca', 'cab', 'cba'] 6

【问题讨论】:

你可以简单地使用permutations from itertools: list(map(''.join, (permutations('abc')))) @LevZakharov 不是重点 - OP 给出了明确的限制,因为这是一项家庭作业,我们必须尊重他们。 @LevZakharov 我不允许使用这样的工具。我必须使用 1 个递归函数调用来完成这个任务 我的意思是你可以从python文档中查看permutationsimplementation。 你会使用推导式吗?因为完全无循环地做到这一点可能并非易事。 【参考方案1】:

让我们考虑一下没有代码的情况,从一般情况开始。假设您已经知道"bc" 的排列,它们是["bc", "cb"]。您如何将"a" 添加到组合中?我将采用到目前为止生成的每个元素,并在每个位置插入a。所以,取"bc",并在每个位置插入"a",你会得到["abc", "bac", "bca"]。然后对"cb" 执行相同操作。这将我们引向基本情况:由于每次递归都会乘以结果的数量,因此基本情况中的结果数量必须为 1,而不是 0,因为当我们迭代上一级的解决方案时,您将无法追加什么都没有,因为什么都没有。因此,anagrams("") 必须返回 [""](以便稍后插入 "c" 会将其置于唯一可以使用的位置)。

不幸的是,这已经是我们正在讨论的两个循环(即使算法具有一般递归性质):一个循环遍历["cb", "bc"],一个循环遍历插入"a" 的位置。如果您可以使用推导式,则可以很容易地做到这一点。如果你不能,那么……每个循环都可以重写为递归,所以……让我再想一想。

【讨论】:

def anagram(st): if st == '': return [''] lout = [ ] for i in range(len(st)): st2 = st[:i]+st [i+1:] lout2 = anagram(st2) for w in lout2: lout.append(st[i]+w) return lout 第 2 课的注释中有一个字谜生成器。编写一个不同的字谜生成器,它只进行一次递归调用,而不是像注释中的程序那样进行 n 次递归调用。设置一个实验来比较两个程序的运行时间。制作一个表格来显示你的结果。执行计算,直到您看到结果有所不同,或者直到您用尽了运行字谜生成器所需的资源。描述你的结果,并预测这两种算法的未来行为。 抱歉第一条评论中的代码混乱。我真的不知道如何在 cmets 中格式化它。第二条评论是他问我们的问题。 请注意,您给定的代码中确实有循环:P 该任务没有说“没有循环”,只是“每次函数调用不要多次进行递归调用”。我的算法符合这个限制。 此注释中的代码是他希望我们转换为 1 递归调用的代码。如果这会改变您的算法中的任何内容,我会发现

以上是关于Python - 递归字谜函数的主要内容,如果未能解决你的问题,请参考以下文章

使用python中的递归解决方案在字符串列表中查找字谜

所有字谜 - 递归

如何在不递归的情况下找到所有可能的字谜?

字谜Python 3 [关闭]

while循环检查python中的字谜

为啥这个字谜函数不正确?