python - Python - 递归字谜函数
问题描述
我正在做家庭作业,有点卡住了,请帮忙。
我不希望将答案交给我,但如果我能得到一些帮助或提示,我将不胜感激。
我必须创建一个字谜生成器,它只进行 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
解决方案
让我们考虑一下没有代码的情况,从一般情况开始。假设您已经知道 的排列"bc"
,它们是["bc", "cb"]
。你如何添加"a"
到混合物中?我会采用到目前为止生成的每个元素,并插入a
每个位置。所以,取,并在每个位置"bc"
插入,你会得到。然后对. 这将我们引向基本情况:由于每次递归都会乘以结果的数量,因此基本情况中的结果数量必须为 1,而不是 0,因为当我们迭代上一级的解决方案时,您将无法追加什么都没有,因为什么都没有。因此,必须返回(以便稍后插入将其放入唯一可以使用的位置)。"a"
["abc", "bac", "bca"]
"cb"
anagrams("")
[""]
"c"
不幸的是,这已经是我们正在谈论的两个循环(即使具有算法的一般递归性质):一个循环遍历["cb", "bc"]
,一个循环遍历要插入的位置"a"
。如果你可以使用推导式,你就可以很容易地做到这一点。如果你不能,那么......每个循环都可以重写为递归,所以......让我再想一想。
推荐阅读
- angular - 如何将指纹扫描仪与前端 Angular 和后端 .NET (c#) Web App 集成
- c# - 使用 nuget pack 解决具有一些不安全代码的解决方案时出现错误
- javascript - 如何在 React/Node 中按顺序处理 api 调用承诺
- typescript - 类型“布尔”不可分配给“假”类型
- wpf - 如何正确设置此按钮与父 ListView ItemsControl 的绑定?
- log4j2 - 清除日志文件后,Log4j2 停止记录到日志文件
- postgresql - 是否有一个命令可以在 Postgresql 中为我提供逻辑查询计划概述?
- android - 为什么我得到一个日期而代码显示另一个
- python-3.x - 依次在不同目录中运行多个 Python 脚本
- c - 如何在C语言(C文件)的Linux上为不加载任何外部图像文件的单独运行程序设置图标?