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)