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]
- 在此嵌套执行中:
外部
循环进行递归调用,将其作为参数传递[3]。我们知道这是基本情况,所以我们得到[[3]]作为返回值。请注意,这是一个列表列表 外部for
循环迭代两次,在[3]的索引0和索引1处“注入”2,这样我们得到[2,3]和[3,2]作为第一个结果,并附加到for
res
返回给调用者,即[2,3],[3,2]]res
res
。然后递归结果中的第二个子列表以相同的方式处理,因此我们得到[1,3,2]、[3,1,2]和[3,2,1],它们也被添加到res
备注:
代码将基本情况标识为一个包含一个元素的数组。这是一个缺点,因为这意味着当您传递空列表时,此函数将遇到堆栈溢出错误。提示:递归调用
permut(array[1:])
从数组的第二个元素开始运行(即数组减去第一个元素)。我需要[a,b,c,d,e]
的所有排列。我递归地找到[b,c,d,e]
的所有排列,对于每一个排列,我将a
粘贴到五个可能的位置中的每一个。这是一个非常好和详细的解释。非常感谢。