递归初识
递归的定义——*在一个函数里再调用这个函数本身*
在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。
**递归的最大深度——1000
递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了1000
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
# RecursionError
# 递归的最大深度1000层 : 为了节省内存空间,不要让用户无限使用内存空间
# 1.递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
#修改递归最大深度
import sys
print(sys.setrecursionlimit(100000))
1.递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
2.循环和递归的关系
递归不是万能的
递归比起循环来说更占用内存
递归函数是怎么停下来的?递归3次结束整个函数
count = 0
def func(): # func1
global count
count += 1 # 1
print(count)
if count == 3: return
func()
print(456)
func()
def func(): # func2
global count
count += 1 # 2
print(count)
if count == 3: return
func()
print(456)
def func(): # func3
global count
count += 1 # 3
print(count)
if count == 3:return
func()
print(456)
函数的调用
函数的参数
函数的返回值
一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件
并不是函数中有return,return的结果就一定能够在调用函数的外层接收到
def func(count):
count += 1
print(count)
if count == 5 : return 5
ret = func(count)
print(count ,':',ret)
return ret
print('-->',func(1))
def func(1):
1 += 1
print(2)
if 2 == 5 : return 5
ret = func(2)
print(ret)
return ret
def func(2):
2 += 1
print(3)
if 3 == 5 : return 5
ret = func(3)
print(ret)
return ret
def func(3):
3 += 1
print(4)
if 4 == 5 : return 5
ret = func(4)
print(ret)
return ret
def func(4):
4 += 1
print(5)
if 5 == 5 : return 5
func(count)
def func(count):
count += 1
print(count)
if count == 5 : return 5
return func(count)
print('-->',func(1))
计算阶乘 100! = 10099989796....*1
# 递归相关
# 1.计算阶乘 100! = 100*99*98*97*96....*1
# 循环
# 递归
# def fin(n):
# if n ==1:
# return 1
# else:
# return n*fin(n-1)
# ret = fin(10)
# print(ret)
# def fin(n):
# if n ==1 :
# return n
# else:
# return n*fin(n-1)
# ret = fin(7)
# print(ret)
2.os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk
# import os
# path = 'e:\py'
# def show_file(path):
# name_lst = os.listdir(path)
# for name in name_lst:
# abs_path = os.path.join(path,name)
# if os.path.isfile(abs_path):
# print(name)
# elif os.path.isdir(abs_path):
# show_file(abs_path)
# show_file(path)
3.os模块:计算一个文件夹下所有文件的大小.这个文件夹下面还有文件夹,不能用walk
# import os
# path = 'e:\py'
# def file_size(path):
# size =0
# name_lst = os.listdir(path)
# for name in name_lst:
# abs_path = os.path.join(path,name)
# if os.path.isfile(abs_path):
# size += os.path.getsize(abs_path)
# else:
# ret = file_size(abs_path)
# size += ret
# return size
#
# print(file_size(path))
4.计算斐波那契数列
找第100个数
1 1 2 3 5 8 13 21
def bf(n):
a = 1
b = 1
if n == 1 or n ==2:
return 1
else:
return bf(n-1)+bf(n-2)
print(bf(100))#算法太low
#优化
def fib(n,a=1,b=1):
if n ==1 or n == 2:
return b
else:
a,b = b , a+b
return fib(n-1,a,b)
print(fib(100))
1 1 2 3 5 8 13 21
用生成器
def fib(n):
a = 1
yield a
b = 1
yield b
while n>2:
a,b = b , a+b
yield b
n -= 1
import time
for i in fib(10):
time.sleep(0.5)
print(i)
5.三级菜单 可能是n级
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
# def menu_func(menu):
# flag = True
# while flag:
# for name in menu:
# print(name)
# key = input('>>>').strip()
# if menu.get(key):
# dic = menu[key]
# ret = menu_func(dic)
# flag = ret
# elif key.upper() =='B':
# return True
# elif key.upper()=='Q':
# return False
#更优版
def menu_func(menu):
while True:
for name in menu:
print(name)
key = input('>>>').strip()
if menu.get(key):
dic = menu[key]
flag = menu_func(dic)
if not flag :
return False
elif key.upper() =='B':
return True
elif key.upper()=='Q':
return False
menu_func(menu)