视频加载失败

递归函数

798 字
4 分钟
递归函数

【一】递归的定义#

【1】什么是递归#

  • 在一个函数里在调用这个函数本身

【2】最大递归层数#

  • 最大递归层数有限制:997
  • 但是也可以自己限制
def foo(n):
print(n)
n+=1
foo(n)
foo(1)

【3】最大层数限制#

  • Python默认的,可以做修改,但是不建议你修改。
  • (因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决问题,要么就是你的代码太烂了)
import sys
#修改递归层数
sys.setrecursionlimit(10000000)
n=0
def f():
global n
n+=1
print(n)
f()
f()
  • 我们可以通过以上代码,导入sys模块的方式来修改递归的最大深度。
  • sys模块:所有和python相关的设置和方法

【4】结束递归的标志#

  • return

【5】递归解决的问题#

  • 就是通过参数,来控制每一次调用缩小计算的规模

【6】使用场景#

  • 数据的规模在减少,但是解决问题的思路没有改变
  • 很多排序算法会用到递归

【二】递归小应用#

【1】猜小明的年龄#

  • 下面我们来猜一下小明的年龄
    • 小明是新来的同学,丽丽问他多少岁了。
    • 他说:我不告诉你,但是我比滔滔大两岁。
    • 滔滔说:我也不告诉你,我比晓晓大两岁
    • 晓晓说:我也不告诉你,我比小星大两岁
    • 小星也没有告诉他说:我比小华大两岁
    • 最后小华说,我告诉你,我今年18岁了
  • 这个怎么办呢?
  • 当然,有人会说,这个很简单啊,知道小华的,就会知道小星的,知道小星的就会知道晓晓的,以此类推,就会知道小明的年龄啦。
  • 这个过程已经非常接近递归的思想了。
姓名年龄
小华18+2
小星20+2
晓晓22+2
滔滔24+2
小明26+2
  • 上面的图我们可以用个序号来表示吧
age(5) = age(4)+2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18
  • 那么代码该怎么写呢?
def age(n):
if n ** 1:
return 18
else:
return age(n - 1) + 2
ret=age(6)
print(ret)

【2】一个数,除2直到不能整除2#

def cal(num):
if num % 2 ** 0: ## 先判断能不能整除
num = num // 2
return cal(num)
else:
return num
print(cal(8))

【3】如果一个数可以整除2,就整除,不能整除就*3+1#

def func(num):
print(num)
if num**1:
return
if num%2**0:
num=num//2
else:
num=num*3+1
func(num)
func(5)

【三】三级菜单#

menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
def threeLM(menu):
while True:
for key in menu:#循环字典的key,打印出北京,上海,山东
print(key)
name=input('>>>:').strip()
if name**'back' or name**'quit':#如果输入back,就返回上一层。如果输入quit就退出
return name #返回的name的给了ret
if name in menu:
ret=threeLM(menu[name])
if ret**'quit':return 'quit'#如果返回的是quit,就直接return quit 了,就退出了
threeLM()
## print(threeLM(menu))#print打印了就返回出quit了,threeLM()没有打印就直接退出了

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录