Rabb52HZ 发表于 2017-12-21 23:03:23

求助,python函数嵌套相关

外部循环基本可以理解,但是在else中又嵌套了一个perm函数,在debug过程中,begin的值经过else后面的循环先增大后又减小,即begin值经过外部增大到4,打印结果,然后直接跳到else里面的perm函数,被else这个循环搞得很头晕,望大佬解答

count = 0
def perm(n,begin,end):
    global count
    if begin>=end:
      print(n)
      count += 1
    else:
      i = begin
      for num in range(begin,end):
            n,n = n,n
            perm(n, begin + 1, end)
            n, n = n, n
n = ['a', 'b', 'c', 'd']
perm(n, 0, len(n))

ba21 发表于 2017-12-21 23:13:57

这是递归。不是函数嵌套 。要理解递归就要用最简单的例子来走流程就容易理解。知道意思就行了。
建议用 递归:斐波那契数列 前几个数走下流程

BngThea 发表于 2017-12-22 06:50:48

这是函数调用自身,也就是递归
请学习小甲鱼老师的关于递归的课程

不二如是 发表于 2024-1-11 19:30:43

型的递归函数,用来生成列表n的所有排列。让我们逐步分解这个函数的工作原理:


[*]函数定义:perm(n, begin, end)是一个递归函数,参数n是要排列的列表,begin是当前递归开始操作的索引,end是列表的长度。
[*]递归基础情况:当begin大于或等于end时,说明我们已经到达了一种完整的排列,打印当前排列并增加计数器。
[*]递归循环:如果begin小于end,则进入一个for循环,循环从begin到end-1的每个索引。
[*]交换元素:在每次循环中,将位置num的元素与位置begin的元素交换,这是为了将每个可能的元素放到当前的begin位置。
[*]递归调用:交换后,通过递归调用perm(n, begin + 1, end)来处理下一个位置,从begin+1开始。
[*]元素复原:递归返回后,再次交换num和begin位置的元素,以便恢复列表的原始顺序,这样其他递归分支可以使用未被改变的列表。

关键点在于理解递归调用如何工作。每一层递归调用都试图在begin位置放置不同的元素,并递归地在剩余的位置创建所有可能的排列。一旦完成了对所有可能排列的探索,它会返回到上一层递归,并尝试另一个元素。

在else块中,当perm(n, begin + 1, end)递归调用返回后,n和n(n)的交换是为了回溯,也就是说,它将列表恢复到递归调用之前的状态。这样,下一次for循环迭代时,列表是没有被前一个递归调用改变的。

理解这一点的关键是,每次递归调用都是在尝试构建从begin到end的所有可能排列。当递归“深入”一层后,它会尝试填充begin+1位置的所有可能元素。当它“回溯”(递归返回)到较浅的层时,它会通过交换来恢复状态,并尝试下一个可能的元素在begin位置。

页: [1]
查看完整版本: 求助,python函数嵌套相关