""" """ """ 一函数的递归 函数在调用阶段直接或间接的又调用了自身 如; def func(n): func里面的值n print("from func",n) 打印fromfunc 还有n func(n+1) def func(1) 在这里func调用了上面的func且n+1陷入了死循环 如果启动 就会死机或者直接卡死但是python解释器害怕会发生这样的事情 从而做出的优化这个循环顶多在997 or 998 这两个数字左右 就会停止 2 def index(): print("from index") 第一个函数调用了第二个函数 login() 都在等一那一个结束但是 上面的函数调用了下面的函数login 下面的函数在调用上面的函数index 所以结束不了从而造成死循环 def login() print("from index") index() login() 函数不该无限制的递归下去 递归: 递归分为两个阶段 1.回溯: 就是一次次的重复的过程,这个重复的过程 必须建立在每一次重复的问题的复杂度都会降下来 2.递推: 一次次的往回推导的过程 例子 我的面前站了五个人 我问第一个人,说你多大了 他说比后面的大两岁 我然后问后面的 我问他,他说我也比后面的大两岁,我就这样重复的问问道 最后一个人 那个人说他18岁 由此我可以推断 第四个人20 第三个人22 第二个人24第一个人= 26 而 这个过程 就是递归 前面我问就等于回溯 后面我的推断知道了每个人的年纪 就是递推 但是要把这个你心里想的话 要用程序写出来 就是下面的 age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18 既然知道了这个 过程 那么用函数的表达方式表达出来就行了 age(n) = age(n-1)+2 age(1) = 18 def age(n) 开始吧下面的age(5)的值给了n这时候n就等于5 if n==1: 如果n==1的时候那么结束 return 18 return的返回值是18 吧18 返回给了age return age(n-1)+2 这里的返回n-1=4 再返回因为n!=1重复循环 res = age(5) 的结果是age=8 满足了n==1 返回值18 加上8 就等于26把这个值返回了age print(res) 然后用res接受了这个值 然后 print的结果就是26 二 将列表的中的数字一次循环打印出来 因为数字较多循环的层数是你必须要考虑的 l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]] 首先想到的是用for循环吧里面的数字取出来 for i in l: 首先for循环吧列表里面的值拿出l 列表里面只有两个值 if type(i) is int: 如果i是 整形那么打印 如果不是就不打印 从而筛选数来不至于吧每层中的列表打印出来 print(i) 第一个打印出来的是1然后继续 else: for item in i: 这时候 你就要考虑 像这个方式你就要重复的使用9次 如果这个列表里面有一万个数字 if type(item) is int: 那么你可能敲一天的代码 敲完了老板说 算了我就要50 那么又要删除好久 print(item) 所以 太麻烦 从这 推断我们得到首先可以用函数因为重复的功能太多 def get_num(l): for i in l: 1,用for循环 吧l列表的值给i if type(i) is int: 2,如果i是 整形那么打印 如果不是就不打印 从而筛选数来不至于吧每层中的列表打印出来 print(i) 第一个打印1 然后继续 else: get_num(i) 1,如果不是就打印i这个列表然后返回接受的到的列表再次提取 再次循环 get_num(l) 2,这时候吧循环出来的值 l1 = [] 给了ll就等于i for i in l1: 3,吧i的值 通过for循环 全部传入列表中 print(l1) 4,打印l1 为什么这里没有erturn 因为列表的值是固定的会循环完 循环完了 就结束了 所以不会陷入死循环中 """