Python 用for循环调用递归

Python 用for循环调用递归,python,for-loop,recursion,tree,permutation,Python,For Loop,Recursion,Tree,Permutation,我不能把我的头缠在这上面: def permut(array): if len(array) == 1: return [array] res = [] for permutation in permut(array[1:]): for i in range(len(array)): res.append(permutation[:i] + array[0:1] + permutation[i:]) retu

我不能把我的头缠在这上面:

def permut(array):
    if len(array) == 1:
        return [array]
    res = []
    for permutation in permut(array[1:]):
        for i in range(len(array)):
            res.append(permutation[:i] + array[0:1] + permutation[i:])
    return res
特别是for循环的第一行——树是什么样子的?我甚至不能得到与我正在绘制的函数相同的结果。 任何帮助都将不胜感激

递归“树”实际上只是一条路径。只有一个地方可以进行递归调用

该算法基于以下思想:

如果我们知道数组中短一个元素的所有排列,那么我们可以使用这些排列来导出当前数组的所有排列:只需在所有这些排列中的所有可能位置添加排除的元素

递归函数的基本情况是数组只有一个元素。在这种情况下,只有一种排列,即数组本身

因此,让我们为输入[1,2,3]运行此代码:

外部
for
循环进行递归调用,将其作为参数传递[2,3]

  • 在此嵌套执行中:

    外部
    for
    循环进行递归调用,将其作为参数传递[3]。我们知道这是基本情况,所以我们得到[[3]]作为返回值。请注意,这是一个列表列表

    外部
    for
    循环迭代两次,在[3]的索引0和索引1处“注入”2,这样我们得到[2,3]和[3,2]作为第一个结果,并附加到
    res

    res
    返回给调用者,即[2,3],[3,2]]

外部循环执行3次。每次在递归调用的每个结果的不同位置注入1时。递归调用的第一个结果是[2,3]。在三个可能的位置注入1,得到[1,2,3]、[2,1,3]和[2,3,1],它们被添加到
res
。然后递归结果中的第二个子列表以相同的方式处理,因此我们得到[1,3,2]、[3,1,2]和[3,2,1],它们也被添加到
res

备注:


代码将基本情况标识为一个包含一个元素的数组。这是一个缺点,因为这意味着当您传递空列表时,此函数将遇到堆栈溢出错误。

提示:递归调用
permut(array[1:])
从数组的第二个元素开始运行(即数组减去第一个元素)。我需要
[a,b,c,d,e]
的所有排列。我递归地找到
[b,c,d,e]
的所有排列,对于每一个排列,我将
a
粘贴到五个可能的位置中的每一个。这是一个非常好和详细的解释。非常感谢。