Python递归函数 二分查找算法实现解析


Posted in Python onAugust 12, 2019

一、初始递归

递归函数:在一个函数里在调用这个函数本身。

递归的最大深度:998

正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).

拿什么来证明这个“998理论”呢?这里我们可以做一个实验:

def foo(n):
  print(n)
  n += 1
  foo(n)
foo(1)

由此我们可以看出,未报错之前能看到的最大数字就是998.当然了,997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:

import sys
print(sys.setrecursionlimit(100000))

我们可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~

看到这里,你可能会觉得递归也并不是多么好的东西,不如while True好用呢!然而,江湖上流传这这样一句话叫做:人理解循环,神理解递归。所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛。而且之后我们学习的很多算法都会和递归有关系。来吧,只有学会了才有资本嫌弃!

二、递归示例讲解

这里我们又要举个例子来说明递归能做的事情。

例一:

现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

你又问武sir,武sir也不告诉你,他说他比太白大两岁。

那你问太白,太白告诉你,他18了。

这个时候你是不是就知道了?alex多大?

1 金鑫 18
2 武sir 20
3 egon 22
4 alex 24

你为什么能知道的?

首先,你是不是问alex的年龄,结果又找到egon、武sir、太白,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。我们就来具体的我分析一下,这几个人之间的规律。

age(4) = age(3) + 2 
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40

那这样的情况,我们的函数怎么写呢?

def age(n):
  if n == 1:
    return 40
  else:
    return age(n-1)+2
print(age(4))

如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?

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]

你说,so easy!

l.index(66)...

我们之所以用index方法可以找到,是因为python帮我们实现了查找方法。如果,index方法不给你用了。。。你还能找到这个66么?

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]
i = 0
for num in l:
  if num == 66:
    print(i)
  i+=1

上面这个方法就实现了从一个列表中找到66所在的位置了。

但我们现在是怎么找到这个数的呀?是不是循环这个列表,一个一个的找的呀?假如我们这个列表特别长,里面好好几十万个数,那我们找一个数如果运气不好的话是不是要对比十几万次?这样效率太低了,我们得想一个新办法。

二分查找算法

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]

你观察这个列表,这是不是一个从小到大排序的有序列表呀?

如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

Python递归函数 二分查找算法实现解析

这就是二分查找算法!

那么落实到代码上我们应该怎么实现呢?

简单版二分法

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)//2
  if 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)

升级版二分法

l1 = [1, 2, 4, 5, 7, 9]
def two_search(l,aim,start=0,end=None):
  end = len(l)-1 if end is None else end
  mid_index = (end - start) // 2 + start
  if end >= start:
    if aim > l[mid_index]:
      return two_search(l,aim,start=mid_index+1,end=end)
    elif aim < l[mid_index]:
      return two_search(l,aim,start=start,end=mid_index-1)

    elif aim == l[mid_index]:
      return mid_index
    else:
      return '没有此值'
  else:
    return '没有此值'
print(two_search(l1,9))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用于计算对数的log()方法
May 15 Python
Python编程实现蚁群算法详解
Nov 13 Python
Python登录注册验证功能实现
Jun 18 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
对python判断ip是否可达的实例详解
Jan 31 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 #Python
Django实现发送邮件找回密码功能
Aug 12 #Python
使用pyecharts生成Echarts网页的实例
Aug 12 #Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 #Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 #Python
Python实现网页截图(PyQT5)过程解析
Aug 12 #Python
python实现知乎高颜值图片爬取
Aug 12 #Python
You might like
JAVA/JSP学习系列之六
2006/10/09 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
php中使用url传递数组的方法
2015/02/11 PHP
php字符集转换
2017/01/23 PHP
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
使用tensorflow实现AlexNet
2017/11/20 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
商场消防管理制度
2014/01/12 职场文书
爱心捐款感谢信
2015/01/20 职场文书
德劲DE1108畅想
2021/04/22 无线电