一,什么叫递归

#递归
#在一个函数里调用自己
#python递归最大层数限制 997
#最大层数限制是python默认的,可以做修改
#但是我们不建议你修改

例子和尚讲故事

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #:基础版本
def story():
print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
while True:
story() #:递归版本
def story():
#递归函数,在一个函数内调用自己
#最大递归层数做了一个限制:997
print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
story()
print('')
story()

修改深度

 #!/usr/bin/env python
#_*_coding:utf-8_*_ import sys #所有和python相关的设置和方法
sys.setrecursionlimit(10000000)
n = 0
def f():
global n
n += 1
print(n)
f()
f()

二,递归实例

递归实现三级菜单

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #三级菜单,按B返回
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
print('主菜单'.center(40,'='))
# while True:
# for i in menu:print(i)
# user1 = input('no 1>>>:')
# if user1 == 'b':break
# if user1 == 'q':exit()
# if user1 not in menu:continue
# if user1 in menu:
# while True:
# for i1 in menu[user1]: print(i1)
# user2 = input('no 2>>>:')
# if user2 == 'b': break
# if user2 == 'q': exit()
# if user2 not in menu[user1]: continue
# if user2 in menu[user1]:
# while True:
# for i2 in menu[user1][user2]: print(i2)
# user3 = input('no 3>>>:')
# if user3 == 'b': break
# if user3 == 'q': exit()
# if user3 not in menu[user1][user2]: continue
# if user3 in menu[user1][user2]:
# while True:
# user4 = input('no 4>>>:')
# if user4 == 'b':break
# if user4 == 'q':exit() def list(menu): #menu being
while True:
for i in menu:
print(i)
k = input('>>>').strip()##beijng
if k == 'b' or k =='q': #k
return k #diyi beijing
if k in menu:
ret = list(menu[k]) #menu shahe
if ret == 'q':return 'q'
index = list(menu)
print(index)

递归实现二分查找

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #二分查找算法
#算法:计算的方法
#有序的递增列表
#查找的是数字
l = [2,3,5,10,15,16,18,22,26]
def find(l,aim): #l:列表 aim:要找的
mid = len(l)//2 #计算中点
if l[mid] > aim: #判断中间位置的值和目标值的大小关系
new_l = l[:mid] #[16,18] = [16,18,22,26][:mid]
return find(new_l,aim)
elif l[mid] < aim:#判断中间位置的值和目标值的大小关系
new_l = l[mid+1:]
return find(new_l,aim)
else:
return l[mid]
print(find(l,16)) #升级版二分法
#查找的是索引
l = [2,3,5,10,15,16,18,22,26]
def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26] 0,8
mid = (end+start)//2 #4 #5+8/2=6 #start =5 end = 5 mid = 5
if start < end:
if l[mid] > aim: #15 17 #18 17
end = mid -1 #end =6-1 = 5
return find2(l,aim,start,end)
elif l[mid] < aim: #15 17
start = mid + 1 # start = 5
return find2(l, aim, start, end)
else:
return mid
else:
return "找不到"
print(find2(l,18,start=0,end = len(l)-1)) #高级版二分法
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l, aim,start = 0,end = len(l)-1 ):
mid = (start+end)//2
print(l[start:end+1])
if not l[start:end+1]: #空就是False not 就是 true
return
elif aim > l[mid]:
return func(l,aim,mid+1,end)
elif aim < l[mid]:
return func(l,aim,start,mid-1)
elif aim == l[mid]:
print("bingo")
return mid
index = func(l,1)

三,总结

#递归解决的问题
#就是通过参数,来控制每一次调用缩小计算的规模
#适合的场景
#数据的规模在减小,但是解决问题的思路没有改变
#结束递归的标志:return

python开发函数进阶:递归函数的更多相关文章

  1. python开发函数进阶:生成器表达式&各种推导式

    一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...

  2. python开发函数进阶:装饰器

    一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...

  3. python开发函数进阶:匿名函数

    一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...

  4. python开发函数进阶:可迭代的&迭代器&生成器

    一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的   iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...

  5. python开发函数进阶:内置函数

    一,内置函数 #内置的模块#拿过来直接就用的:内置的函数 #!/usr/bin/env python #_*_coding:utf-8_*_ #内置的模块 #拿过来直接就用的:内置的函数 #作用域相关 ...

  6. python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)

    一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序       内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程 ...

  7. 【转】Python之函数进阶

    [转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...

  8. Python之函数进阶

    本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...

  9. 《Python》 函数进阶和名称空间作用域

    函数进阶: 一.动态参数:*args  **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...

随机推荐

  1. npm的镜像和淘宝互换

    1.得到原本的镜像地址 npm get registry > https://registry.npmjs.org/ 设成淘宝的 npm config set registry http://r ...

  2. MYSQL变量和状态

    mysql设置变量是在my.cnf文件里,修改配置文件后需要重启mysql的服务,才能生效.但是在线上服务器是不允许随便重启的,我们可以用命令直接修改变量值,使其生效.然后再修改配置文件中的值,以防止 ...

  3. day5-shelve模块

    一.概述 前面章节我们讲述了json和pickle模块的序列化和反序列化处理,他们有一个不足是在python 3中不能多次dump和load,shelve模块则可以规避这个问题.shelve模块是一个 ...

  4. asp.net获取URL和IP地址

    (转自:http://www.cnblogs.com/JuneZhang/archive/2010/11/26/1888863.html) HttpContext.Current.Request.Ur ...

  5. 下载并安装Prism5.0库 Download and Setup Prism Library 5.0 for WPF(英汉对照版)

    Learn what’s included in Prism 5.0 including the documentation, WPF code samples, and libraries. Add ...

  6. windows7自动登录后锁定 & 其他VBS

    首先设置自动登录(原已设置登录密码),在开始菜单搜索框输 入 “netplwiz” 按 回车,打开高级用户控制面板,然后取消对“要使用本机,用户需输入用户名和密码(E)”项的勾选,系统弹出窗口要求输入 ...

  7. 单链表删除(Delete)或者去除(Remove)节点面试题总结

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76061004冷血之心的博客) 关于单链表反转的多种形式请参见本博文 ...

  8. 一个通用Makefile详解

    我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文 件. 如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写 ...

  9. linux 系统统计目录下文件夹的大小

    du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看 ...

  10. 深入理解java虚拟机-第七章

    第7章 虚拟机类加载机制 类的加载的时机 加载 Loading, 连接 Linking(验证 Verfiication, 准备Preparation, 解析 Resolution) 初始化 Initi ...