递归函数
import sys # sys.setrecursionlimit(1200) # 修改递归层数限制 count = 0 def func(): global count count += 1 print(count) func() print(456) func() # RecursionError:递归错误 # 官网规定的递归的最大深度1000层:为了节省内存空间,不让用户无限使用内存空间 # 1.递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合递归解决 # 2.循环和递归的关系: # 递归不是万能的 # 递归比起循环来说更占用内存 # 你的递归函数 必须要停下来 count = 0 def func(): global count count += 1 print(count) if count == 3: return func() print(456) func() # 函数的调用 # 函数的参数 # 函数的返回值 # 一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是可达到的 def func(count): count += 1 # print(count) if count == 5: return 5 ret = func(count) return ret r = func(1) print(r)
递归函数相关习题:
# # 1.计算阶乘 5! = 5*4*3*2*1 # # 循环: # r = 1 # for i in range(5, 0, -1): # r *= i # print(r) # # # 递归: # def func(n): # # if n == 1: # return 1 # ret = n * func(n - 1) # return ret # # # print(func(5)) # 2.os模块;查看一个文件夹下的所有文件,这个文件下面还有文件夹 import os # dir_path = 'F:\Lnh_Study\lnh_01_基础部分\lnh_14_模块的多种导入方式' # dir_ls = os.listdir('F:\Lnh_Study\lnh_01_基础部分\lnh_14_模块的多种导入方式') # print(dir_ls) # # count = len(dir_ls) # def func(path, dir_ls): # global count # if count == 0: # return # for name in dir_ls: # count -= 1 # stats = os.path.isdir(path + '/'+ name) # # if stats and name != '__pycache__': # new_path = path + '/' + name # print(new_path) # new_ls = os.listdir(new_path) # print(new_ls) # func(new_path, new_ls) # # # func(dir_path, dir_ls) # 3.os模块;计算一个文件夹下所有文件的大小,这个文件下面还有文件夹,不能用walk # dir_path = 'F:\Lnh_Study\lnh_01_基础部分\lnh_14_模块的多种导入方式' # dir_ls = os.listdir(dir_path) # print(dir_ls) # def func(path, dir_ls): # file_size = 0 # for name in dir_ls: # stats = os.path.isdir(os.path.join(path, name)) # if stats: # new_path = os.path.join(path, name) # print(new_path) # new_ls = os.listdir(new_path) # print(new_ls) # ret = func(new_path, new_ls) # file_size += ret # else: # file_size += os.path.getsize(os.path.join(path, name)) # # return file_size # # ret = func(dir_path, dir_ls) # print(f'文件夹大小:{ret}字节') # 4.计算斐波那契数列 找第100个数 # 循环:1 1 2 3 5 8 13 21 def func(n): a = 1 b = 1 for i in range(n): yield a a, b = b, a+b obj = func(2) print(list(obj)) # 递归: def func(n): n -= 1 if n == 0: return 1, 1 ret = func(n) return ret[1], (sum(ret)) ret = func(100) print(ret[0]) # 5.三级菜单 可能是n级... # menu = { # '北京': { # '海淀': { # '五道口': { # 'soho': {}, # '网易': {}, # 'google': {} # }, # '中关村': { # '爱奇艺': {}, # '汽车之家': {}, # 'youku': {}, # }, # '上地': { # '百度': {}, # }, # }, # '昌平': { # '沙河': { # '老男孩': {}, # '北航': {}, # }, # '天通苑': {}, # '回龙观': {}, # }, # '朝阳': {}, # '东城': {}, # }, # '上海': { # '闵行': { # "人民广场": { # '炸鸡店': {} # } # }, # '闸北': { # '火车战': { # '携程': {} # } # }, # '浦东': {}, # }, # '山东': {}, # } # # def threeLM(dic): # while True: # for k in dic: # print(k) # key = input('input>>').strip() # if key == 'b' or key == 'q': # return key # elif key in dic.keys() and dic[key]: # ret = threeLM(dic[key]) # if ret == 'q': # return 'q' # # threeLM(menu)