鱼C论坛

 找回密码
 立即注册
查看: 3866|回复: 3

求助,python函数嵌套相关

[复制链接]
发表于 2017-12-21 23:03:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
外部循环基本可以理解,但是在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[num],n[i] = n[i],n[num]
            perm(n, begin + 1, end)
            n[num], n[i] = n[i], n[num]
n = ['a', 'b', 'c', 'd']
perm(n, 0, len(n))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-21 23:13:57 | 显示全部楼层
这是递归。不是函数嵌套 。要理解递归就要用最简单的例子来走流程就容易理解。知道意思就行了。
建议用 递归:斐波那契数列 前几个数走下流程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-22 06:50:48 From FishC Mobile | 显示全部楼层
这是函数调用自身,也就是递归
请学习小甲鱼老师的关于递归的课程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[num]和n[i](n[begin])的交换是为了回溯,也就是说,它将列表恢复到递归调用之前的状态。这样,下一次for循环迭代时,列表是没有被前一个递归调用改变的。

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表