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文档中查看permutations
implementation。
你会使用推导式吗?因为完全无循环地做到这一点可能并非易事。
【参考方案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 - 递归字谜函数的主要内容,如果未能解决你的问题,请参考以下文章