一,什么叫递归

#递归
#在一个函数里调用自己
#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. yii2:frontend/frontactoin curl生成

    yii2:frontend/frontactoin curl生成 想要覆写已存在文件,选中 “overwrite” 下的复选框然后点击 “Generator”.如果是新文件,只点击 “Generato ...

  2. Linux文件夹权限详解

    - 第一个字符代表文件(-).目录(d),链接(l) - 其余字符每3个一组(rwx),读(r).写(w).执行(x) - 第一组rwx:文件所有者的权限是读.写和执行 - 第二组rw-:与文件所有者 ...

  3. 【Android压力测试】monkey压力测试

    1.首先安装adb.java环境 2.下载地址: 链接: https://pan.baidu.com/s/1i5xltpN 密码: ra6g monkey 很简单的理解是 像猴子一样一顿点乱点,看是否 ...

  4. 用fail2ban阻止ssh暴力破解root密码

    安装fail2ban工具来实现防暴力破解,防止恶意攻击,锁定恶意攻击IP. 1.如果是centos系统,先yum安装fail2ban [root@VM_152_184_centos /]# yum - ...

  5. hibernate13--缓存

    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN&q ...

  6. DOM解析XML文件例子

    DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式. 一般分为以下几步: 1. 定义好目标XML文件路径path . 2. 实例化DOM解析工厂对象 ,Document ...

  7. JSP的指令

    JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute="value" %&g ...

  8. Illumina Fastq Q-score

    Illumina Nextseq500 Miseq HiseqXten 测序仪 Q-score均采用下面的编码格式,仅作简要介绍. Q-score Q-score 在fastq中每个序列的第4行,代表 ...

  9. 程序员们,AI来了,机会来了,危机也来了

    程序员们,AI来了,机会来了,危机也来了 1.人工智能真的来了 纵观古今,很少有计算机技术能有较长的发展寿命,大部分昙花一现,比如:昔日的DOS.windows3.2.foxpro.delphi.80 ...

  10. TF随笔-3

    >>> import tensorflow as tf>>> node1 = tf.constant(3.0, dtype=tf.float32)>>& ...