python之路----递归函数(二分查找法)
递归函数 (关键点在于找到明确的函数结束点)
递归调用:在调用一个函数的过程中,直接或间接的调用了该函数的本身 而且递归函数必须要有一个结束条件
无限的递归理论上是不允许的 最大允许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之路----递归函数(二分查找法)相关推荐
- python函数教程:Python递归函数 二分查找算法实现解析
这篇文章主要介绍了Python递归函数 二分查找算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.初始递归 递归函数:在一个函数里在调 ...
- Python 关于下标的运用技巧(二分查找法,冒泡、选择、插入、归并、快速排序算法)
二分查找法(折半查找法)的递归实现 二分查找法(折半查找法):用于预排序列表的查找问题, 再次强调,二分查找法要配合排序使用,只有排好序,才能使用二分查找法 而且,待查找列表如果有重复值,只能查找到其 ...
- python使用二分查找法查找某个数是否在列表内
输入一个数,使用二分查找法查找它是否在列表[34,64,67,72,73,82,83,85,87,88,90,91,96,98]中.如果找到,输出此数及其索引值,否则输出"没有找到" ...
- 每天5分钟玩转python3算法:二分查找法
从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...
- 小白的算法初识课堂(part1)--二分查找法
学习笔记 学习书目:<算法图解>- Aditya Bhargava 二分查找法 算法是一组完成任务的指令,任何代码片段都可视为算法.二分查找是一种算法,其输入是一个有序的元素列表(必须有序 ...
- 二分查找python实现代码_二分查找——Python实现
一.排序思想 二.python实现 def binarySearchDemo(arr, key): """ python二分查找非递归方式 :param arr:待排序列 ...
- 一万个数查找两个重复数,快速二分查找法 O(logN)(转)
题目:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? 一.有序情况 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- java 二分查找_计算机入门必备算法——二分查找法
1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...
最新文章
- 弹出页(指定高度,自由拖动,点击空白包括状态栏触发)
- cnblogs.com精华收藏帖
- DDoS(Distributed Denial of Service,分布式拒绝服务)
- AAAI 2020 开源论文 | 语义感知BERT(SemBERT)
- Linux C编程之四 动态库(共享库)的制作
- python 批量下载网页图片_Python实现多线程批量下载图片
- oracle如何创建视图
- Atom飞行手册翻译: 3.4 文本处理包
- 3389改为3390端口如何改
- 干货!286页李宏毅《深度学习讲义》
- 新手入门HTML5开发,你必须先搞懂这6个问题
- Linux下安装jdk报Permission denied以及chmod详解
- 自动跑程序vbs脚本
- 关闭计算机139端口,关闭端口,详细教您电脑怎么关闭139端口
- Centos7安装ffmpeg和使用youtube-dl下载Youtube视频
- SpaceSniffer(磁盘大小扫描分析) 彻底解决C盘爆满问题 清理C盘必备软件
- 计算机专业教室三行诗,当学霸写起三行情书,看完第一个就懵了……
- TestNG单元测试框架详解
- How to set up the esp-hosted SDK compilation environment for ESP32-C3
- 语法分析器 Java版