递归函数  (关键点在于找到明确的函数结束点)

递归调用:在调用一个函数的过程中,直接或间接的调用了该函数的本身   而且递归函数必须要有一个结束条件

无限的递归理论上是不允许的   最大允许997层  也可以通过sys模块进行修改  但是本质递归层数与取决于电脑自身硬件内存

def func():print('>>>func')func()func无限递归   无限

无限递归

查看最大递归层数#面向函数编程mport sys  #python限制在997/998ys.setrecursionlimit(10000000)  #可以修改
COUNT = 0
def func():  #recursion 递归global COUNTCOUNT += 1print(COUNT)func()

查看递归层数

*****解耦 *****

要完成一个完整的功能,但这个功能的规模要尽量小,并且和这个功能无关的其他代码应该和这个函数分离
    1.增强代码的重用性
    2.减少代码变更的相互影响

什么是递归 #recursion 递归
    一个函数在内部调用自己
    递归的层数在python里是有限制的

递归效率低,需要在进入下一递归时保留当前的状态.

1.1必须有一个明确的结束条件

1.2每进入更深一次递归,问题规模相比上次递归都应该有所减少

l=[1,[2,3,[4,5,[6,7,[8,9,[10,11,[12,13]]]]]]]
def func(l):for i in l:if isinstance(i,list):func(i)else:print(i)func(l)

列表递归

递归实例一:简单年龄

敲两遍  就看懂了    我是不是快成神了
你说你不懂怎么办?   那更好办 敲20遍  还不懂? 神不需要理解凡尘#写递归函数必须要有一个结束条件   这是先决条件
#alex
#alex比egon大两岁 +2
#egon比wushi大两岁 +2
#wushi比金鑫大两岁 +2
#金鑫40了def age(n):if n ==4:return 40return age(n+1)+2# 关键点在于这个return 返回的值是返回给他自身调用的自己而不是返回给age() 而是返回给age()+2#这里还有一个关键点就是 return返回自己调用自己的结果时 可以加上附加条件(就是自己想要计算的)
print(age(1)) #结果为42# def age(n):
#     if n==4:
#         return 40
#     return age(n+1)+2#递归分为两部曲(递+归)
#以下是递 加归
# def age(1):
#     return age(2)+2 #相当于44+2=46
#
# def age(2):
#     return age(3)+2 #相当于42+2=44
#
# def age(3):
#     return age(4)+2 #相当于40+2=42
#
# def age(4):
#     if 4==4:
#         return 40#返回给调用者上层函数

递归实例二:简单数字阶乘

递归不难就是看你肯不肯去倒腾了#求阶乘 n = 7  7*6*5*4*3*2*1
def func(n):if n == 1:return 1else:return n*func(n-1)ret = func(4)
print(ret)# #n = 4
# def func(4):
#     return 4*(4-1) n=3 2*(4-1)*4=24
#
# #n = 3
# def func(3):
#     return 3*(3-1) n=2   1*(3-1)
#
# #n = 2
# def func(2):
#         return 2 2*(2-1) n=1  1*(2-1)
#
# #n = 1
# def func(n):
#     if n == 1:
#         return 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):mid = (len(l)-1)//2if l:if aim > l[mid]:func(l[mid+1:],aim)elif aim < l[mid]:func(l[:mid],aim)elif aim == l[mid]:print("bingo",mid)else:print('找不到')
func(l,66)
func(l,6)

二分法

# list.sort()将列表进行有序化排列
# def search(num ,l ,start=None,end=None):
#定义函数()内写 要找寻的数字,数字所在的列表,开始查找的数字,查找结束的数字
#     start=start if start else 0
#     end = end if end else len(l)-1
#     mid = (end-start)//2+start
#默认开始值是0 结束值列表索引最后一位  中间值为末尾减去开始得的值除以2 加上开始的值
#     if l[mid]>num:
#         search(num,l,start,mid-1)
#     elif l[mid]<num:
#         search(num,l,mid+1,end)
#     elif l[mid]==num:
#         print(mid,l[mid])
#判断阶段分为3种 大于小于 等于    每一次的判断 找寻的数字 和列表不变 但是开始查找的数字和结束的数字会根据判断条件改变
# 直到找到查找的值
# 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]
# search(66,l)def search(num,l,start=None,end=None): #66,[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]start = start if start else 0      #start = 0end = end if end else len(l) - 1   #end = 24mid = (end - start)//2 + start     #mid = 12if l[mid] > num :                  #l[mid] = 41  <  66search(num,l,start,mid-1)elif l[mid] < num:ret = search(num,l,mid+1,end)        #search(66,l,13,24)return retelif l[mid] == num:return mid, l[mid]def search(num,l,start=None,end=None): #66,[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]start = start if start else 0      #start = 13end = end if end else len(l) - 1   #end = 24mid = (end - start)//2 + start     #mid = 18if l[mid] > num :                  #l[mid] = 67  >  66search(num,l,start,mid-1)      #search(66,l,13,17)elif l[mid] < num:ret = search(num,l,mid+1,end)return retelif l[mid] == num:return mid, l[mid]def search(num,l,start=None,end=None): #66,[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]start = start if start else 0      #start = 13end = end if end else len(l) - 1   #end = 17mid = (end - start)//2 + start     #mid = 15if l[mid] > num :                  #l[mid] = 56  <  66search(num,l,start,mid-1)elif l[mid] < num:ret = search(num,l,mid+1,end)        #search(66,l,16,17)return retelif l[mid] == num:return mid, l[mid]def search(num,l,start=None,end=None): #66,[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]start = start if start else 0      #start = 16end = end if end else len(l) - 1   #end = 17mid = (end - start)//2 + start     #mid = 16if l[mid] > num :                  #l[mid] = 56  <  66search(num,l,start,mid-1)elif l[mid] < num:ret = search(num,l,mid+1,end)        #search(66,l,17,17)return retelif l[mid] == num:return mid, l[mid]def search(num,l,start=None,end=None): #66,[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]start = start if start else 0      #start = 17end = end if end else len(l) - 1   #end = 17mid = (end - start)//2 + start     #mid = 17if l[mid] > num :                  #l[mid] = 66  ==  66search(num,l,start,mid-1)elif l[mid] < num:search(num,l,mid+1,end)elif l[mid] == num:return mid, l[mid]               #return 17,66

二分法(2)慎点

二分查找方法(升级版)

def func(l, aim,start = 0,end = len(l)-1 ):mid = (start+end)//2if not l[start:end+1]:returnelif 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 midindex = func(l,68)
print(index)

升级版

递归编写三级菜单

menu = {'北京': {'海淀': {'五道口': {'soho': {},'网易': {},'google': {}},'中关村': {'爱奇艺': {},'汽车之家': {},'youku': {},},'上地': {'百度': {},},},'昌平': {'沙河': {'老男孩': {},'北航': {},},'天通苑': {},'回龙观': {},},'朝阳': {},'东城': {},},'上海': {'闵行': {"人民广场": {'炸鸡店': {}}},'闸北': {'火车战': {'携程': {}}},'浦东': {},},'山东': {},
}def threeLM(menu):while True:for key in menu:print(key)k = input(">>>")if k in menu:threeLM(menu[k])threeLM(menu)

只实现功能,没有前进后退

menu = {'北京': {'海淀': {'五道口': {'soho': {},'网易': {},'google': {}},'中关村': {'爱奇艺': {},'汽车之家': {},'youku': {},},'上地': {'百度': {},},},'昌平': {'沙河': {'老男孩': {},'北航': {},},'天通苑': {},'回龙观': {},},'朝阳': {},'东城': {},},'上海': {'闵行': {"人民广场": {'炸鸡店': {}}},'闸北': {'火车战': {'携程': {}}},'浦东': {},},'山东': {},
}
#相同的数据类型 嵌套在一起
# def Three_Level_Menu(menu):
#     while True:
#         for k in menu:print(k)
#         key = input('>>>')
#         if key == 'q':return 'q'
#         elif key == 'b':break
#         elif key in menu:
#             ret = Three_Level_Menu(menu[key])
#             if ret == 'q': return 'q'
# Three_Level_Menu(menu)

完美版

转载于:https://www.cnblogs.com/zgd1234/p/7265128.html

python之路----递归函数(二分查找法)相关推荐

  1. python函数教程:Python递归函数 二分查找算法实现解析

    这篇文章主要介绍了Python递归函数 二分查找算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.初始递归 递归函数:在一个函数里在调 ...

  2. Python 关于下标的运用技巧(二分查找法,冒泡、选择、插入、归并、快速排序算法)

    二分查找法(折半查找法)的递归实现 二分查找法(折半查找法):用于预排序列表的查找问题, 再次强调,二分查找法要配合排序使用,只有排好序,才能使用二分查找法 而且,待查找列表如果有重复值,只能查找到其 ...

  3. python使用二分查找法查找某个数是否在列表内

    输入一个数,使用二分查找法查找它是否在列表[34,64,67,72,73,82,83,85,87,88,90,91,96,98]中.如果找到,输出此数及其索引值,否则输出"没有找到" ...

  4. 每天5分钟玩转python3算法:二分查找法

    从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...

  5. 小白的算法初识课堂(part1)--二分查找法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 二分查找法 算法是一组完成任务的指令,任何代码片段都可视为算法.二分查找是一种算法,其输入是一个有序的元素列表(必须有序 ...

  6. 二分查找python实现代码_二分查找——Python实现

    一.排序思想 二.python实现 def binarySearchDemo(arr, key): """ python二分查找非递归方式 :param arr:待排序列 ...

  7. 一万个数查找两个重复数,快速二分查找法 O(logN)(转)

    题目:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? 一.有序情况 ...

  8. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  9. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  10. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

最新文章

  1. 弹出页(指定高度,自由拖动,点击空白包括状态栏触发)
  2. cnblogs.com精华收藏帖
  3. DDoS(Distributed Denial of Service,分布式拒绝服务)
  4. AAAI 2020 开源论文 | 语义感知BERT(SemBERT)
  5. Linux C编程之四 动态库(共享库)的制作
  6. python 批量下载网页图片_Python实现多线程批量下载图片
  7. oracle如何创建视图
  8. Atom飞行手册翻译: 3.4 文本处理包
  9. 3389改为3390端口如何改
  10. 干货!286页李宏毅《深度学习讲义》
  11. 新手入门HTML5开发,你必须先搞懂这6个问题
  12. Linux下安装jdk报Permission denied以及chmod详解
  13. 自动跑程序vbs脚本
  14. 关闭计算机139端口,关闭端口,详细教您电脑怎么关闭139端口
  15. Centos7安装ffmpeg和使用youtube-dl下载Youtube视频
  16. SpaceSniffer(磁盘大小扫描分析) 彻底解决C盘爆满问题 清理C盘必备软件
  17. 计算机专业教室三行诗,当学霸写起三行情书,看完第一个就懵了……
  18. TestNG单元测试框架详解
  19. How to set up the esp-hosted SDK compilation environment for ESP32-C3
  20. 语法分析器 Java版

热门文章

  1. python虚拟环境搭建mac_在MAC上安装Python虚拟环境
  2. mysql ibatis 批量插入_ibatis 批量插入逻辑
  3. android全局计时_Android中使用定时器的三种方法
  4. Win32汇编——动态链接库
  5. 测试工程师值得被尊重!是否有此共鸣!
  6. V神:你所理解的“去中心化”不一定准确
  7. HDU 1042 N!( 高精度乘法水 )
  8. 【问底】徐汉彬:PHP7和HHVM的性能之争
  9. 11月全球搜索引擎市场:百度份额突破30% 增势持续
  10. 小Q系列故事——大笨钟