函数递归调用
-
递归就是在函数运行期间直接或者间接的调用了函数自身 ,这就形成了函数的递归
-
递归的缺点:
-
相比于循环执行效率较慢
-
真用内存资源较大
-
python语言不自带尾递归优化
-
-
递归的表现形式
>>> def func(): ... print('Im func') ... func() # 在函数内部调用了自身 ... >>> func() Im func Im func Im func Im func ...... (无数次Im func) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in func File "<stdin>", line 3, in func File "<stdin>", line 3, in func [Previous line repeated 992 more times] File "<stdin>", line 2, in func RecursionError: maximum recursion depth exceeded while calling a Python object # 为什么会出现报错呢? 分析一下func的执行过程 第一次执行func 打印 Im func,并且调用func 函数执行结束了吗?没有 会反复的一直调用func,形成死循环,超出了python的递归深度
-
递归深度
-
顾名思义,就是递归的最深层数,超出了设定的深度就会报错
>>> import sys >>> sys.getrecursionlimit() # 查看递归深度 1000 >>> sys.setrecursionlimit(2000) # 修改递归深度 >>> sys.getrecursionlimit() 2000
# 其实修改递归深度是没什么意义的,白白的浪费资源,因为就算修改成了1亿层,还是有内存限制的 -
-
递归终止条件
# 来做一个小练习就明白了 >>> L = [1,2,[3,4],5,6,[7,8,9]] # 求出所有元素加一起的和 >>> sum1 = 0 >>> def my_sum(l): ... for my_var in l: # 当列表里不存在值得时候结束,这就是终止条件 ... global sum1 ... if isinstance(my_var,list): ... my_sum(my_var) ... else: ... sum1 += my_var ... >>> my_sum(L) >>> print(sum1) # 阶乘 >>> def func(num): ... if num == 1: # 终止条件,等于1时结束 ... return 1 ... return func(num-1) * num ... >>> func(5) 120
-
-
-
- 练习1
-
#!/usr/bin/evn python # -*- coding: utf-8 -*- ''' 需求: 发工资1w元,每天花5/1+50元 问: 能花多少天? ''' # salary = input('您发了多少工资?: ').srtip() salary = 10000 # 花钱 def spend(salary,day=0): spend_monry = (salary / 5 + 50) remnant_money = salary - spend_monry if remnant_money < 0: return day day += 1 print('今天是%d天\n还剩下%d元' % (day,remnant_money)) return spend(remnant_money,day) spend_monry_day = spend(salary) print(spend_monry_day)
-
- 练习2
-
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 需求: 利用递归删除非空目录 ''' import os def rm_dir(my_dir): # 遍历目录下文件 for file_name in os.listdir(my_dir): # 拼接路径和文件 abs_path = os.path.join(my_dir,file_name) # 如果是文件则删除 if os.path.isfile(abs_path): os.remove(os.path.join(my_dir,abs_path)) # 如果不是文件 else: # 文件夹为空则递归函数 if os.listdir(abs_path): rm_dir(abs_path) # 删除目录 os.rmdir(os.path.join(my_dir,abs_path)) # 目录为空则删除 if not os.listdir(my_dir): os.rmdir(my_dir) while True: inp = input('请输入要删除的目录的绝对路径: ').strip() if not inp or not os.path.isdir(inp): print('请输入正确的目录') continue rm_dir(inp)
-
- 练习1