Python 从迭代到递归-对列表重新排序
我有一份清单:Python 从迭代到递归-对列表重新排序,python,recursion,Python,Recursion,我有一份清单: L = [0,'a','b','c'] 如果我运行以下命令: sortedList = [] while len(L) > 0: item = L.pop() sortedList.append(item) print(sortedList) 输出: ['c', 'b', 'a', 0] 作为试图理解递归的一个简单练习,我想把上面的内容放在一个递归函数中。 我有两次尝试-如何修复一次或两次-或者是否存在递归解决方案 一, 二, 递归解决方案可以是: d
L = [0,'a','b','c']
如果我运行以下命令:
sortedList = []
while len(L) > 0:
item = L.pop()
sortedList.append(item)
print(sortedList)
输出:
['c', 'b', 'a', 0]
作为试图理解递归的一个简单练习,我想把上面的内容放在一个递归函数中。
我有两次尝试-如何修复一次或两次-或者是否存在递归解决方案
一,
二,
递归解决方案可以是:
def extract3(seq):
if not seq:
return seq
return [seq.pop()] + extract3(seq)
但是,这会修改输入列表,该列表可能不是您想要的。因此,最好根据需要对输入列表进行切片:
def extract4(seq):
if not seq:
return seq
return [seq[-1]] + extract4(seq[:-1])
其中seq[-1]
表示“取seq
的最后一个元素,seq[:-1]
表示“取seq
的所有元素,最后一个除外”。函数extract4
通过根据需要获取元素而不修改给定序列seq
来构建一个新列表
您还可以使用累加器,该累加器将通过extract5(N,[])调用:
首先,避免使用大写字母作为变量的首字母,更重要的是,当变量的名称看起来像类时,这会让人困惑。从这个著名的递归排序算法中找到一些灵感:这里有几个很好的答案,虽然为了帮助你自己做这件事,但是这里有一个小提示:当你创建递归算法时,你通常需要考虑三个步骤:检查递归结束条件;执行递归。它在代码中不一定是明确的,也不一定是按顺序的,但你需要考虑这些。@Ruud我正在用Python学习一门算法课程。。。。我们已经看到了插入排序、选择排序、合并排序、快速排序、快速搜索、bogosort。。。但是我在理解递归Python时仍然有很多问题:因此,回到基本问题!感谢您的提示-非常感谢。@Ruud感觉OP中函数的一个大问题是有这个额外的列表s
…在寻求递归解决方案时,引入额外的列表可能不是一个好方法?+1感谢Simeon。在OP中,我的想法是增加一个列表s
,这在递归解决方案中永远行不通?或者可以包括一个额外的列表吗?@whytheq:我不确定在哪里需要变量s
。您可以包括一个额外的列表(称为累加器),以提高递归的效率。但是对于一个基本的递归解决方案,不需要额外的列表或变量。感谢Simeon-出于兴趣,extract5
如何使用累加器外观-这是一个简单的添加:在我的方法中,每次重复都会被覆盖,所以我不确定累加器的代码在哪里sits@whytheq我已经更新了答案使用extract5
。它在累加器中建立最终结果acc
extract3
是有风险的,因为它依赖于特定的评估顺序(由于pop
的副作用,+
的左侧必须在右侧之前进行评估),但其他两个函数是两种常见递归风格的优秀表现形式:“优雅”(优雅)(代码>提取4)和“高效”(代码>提取5);实际性能增益取决于运行时的列表实现)。
def extract3(seq):
if not seq:
return seq
return [seq.pop()] + extract3(seq)
def extract4(seq):
if not seq:
return seq
return [seq[-1]] + extract4(seq[:-1])
def extract5(seq, acc):
if not seq:
return acc
acc.append(seq[-1])
return extract5(seq[:-1], acc)