递归

初识递归

递归的定义——在一个函数里再调用这个函数本身

现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

刚刚我们就已经写了一个最简单的递归函数。

递归的最大深度——997

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

递归函数与三级菜单

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

1 def threeLM(dic):

2 while True:

3 for k in dic:print(k)

4 key = input('input>>').strip()

5 if key == 'b' or key == 'q':return key

6 elif key in dic.keys() and dic[key]:

7 ret = threeLM(dic[key])

8 if ret == 'q': return 'q'

9 elif (not dic.get(key)) or (not dic[key]) :

10 continue

11

12 threeLM(menu)

二分法

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]

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

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

这就是二分查找算法

贴上两段代码:

一:简单二分法

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)

二:

  升级版二分法

def func(l, aim,start = 0,end = len(l)-1 ):

  mid = (start+end)//2

  if not l[start:end+1]:

    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,68)

print(index)

      

#递归解决的问题#就是通过参数,来控制每一次缩小计算的规模#适合的场景:数据的规模在减小 解决问题的思路在改变#总结:结束递归的标志:return#用处:未来遇到很多递归的地方,算法(排序算法,金融类) 9#递归函数:在一个函数里调用自己#最大递归层数做了一个限制:997#最大层数限制是python默认的。可以做修改#但是不建议修改#import sys #所以和python相关的设置和放到# def a():# print("ff")# a()# a()## import sys# sys.setrecursionlimit(10000000)# n =1# def a():# global n# n += 1# # print("ff")# print(n)# a()# a()

# def age(n):# if n == 1:# return 40# else:# ret = age(n-1)# return ret + 2# print(age(5))# def age(5):# if 5 == 1:# return 40# else:# ret = 46# return ret + 2## def age(4):# if 5 == 1:# return 40# else:# ret = 44# return ret + 2## def age(3):# if 5 == 1:# return 40# else:# ret = 42# return 44## def age(2):# if 5 == 1:# return 40# else:# ret = 40# return 42## def age(1):# if 5 == 1:# return 40

#age(1) == 40## l = [1,2,3,4,5,6,7,8,9,10,11,12,23,45,67,89,100]# def find(l,aim):# mid = len(l)//2# if l[mid] > aim:# ll=l[:mid]# return find(ll,aim)# elif l[mid] < aim:# ll= l[mid+1:]# return find(ll,aim)# else:# return l.index(aim)# print(find(l,11))## def a(num):# if num %2.2 == 0:# num = num // 2# return a(num)# else:# return num# print(a(8.8))menu = {'北京': {'海淀': {'五道口': {'soho': {}, '网易': {}, 'google': {} }, '中关村': {'爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': {'百度': {}, }, }, '昌平': {'沙河': {'老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {},}# def ak(men):# while True:# for key in men:# print(key)# k = input("input>>>")# return ak(men[k])# print(ak(menu))# def ak(men):# # print("大区信息")# while True:# for key in men:# print(key)# k = input("input(quit或者exit退出)>>>")# if k =="quit" or k == "exit":# return k# else:# return ak(men[k])# print(ak(menu))#

转载于:https://www.cnblogs.com/DE_LIU/p/7264959.html

python--递归、二分查找算法相关推荐

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

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

  2. python二分查找算法_如何使用python的二分查找算法

    如何使用python的二分查找算法 发布时间:2020-11-18 09:27:29

  3. Python实现二分查找算法,图片结合代码讲解,简单易懂

    Python实现二分查找算法,图片结合代码讲解,简单易懂 二分查找是指在一个数组中循环找到特定的目标元素的一种算法,二分查找算法要求这个数组必须是有序的,如果不是有序则最后得出的结果是不准确的,因为其 ...

  4. android二分查找法简书,【PYTHON】二分查找算法

    二分查找: 在一段数字内,找到中间值,判断要找的值和中间值大小的比较. 如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找. 如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找. 直到 ...

  5. python实现二分查找算法_两种方法实现Python二分查找算法

    一. arr=[1,3,6,9,10,20,30] def findnumber(l,h,number): mid=(l+h)//2 if arr[mid]==number: print(" ...

  6. python实现二分查找算法_python实现二分查找算法

    ??二分算法的定义不在多说了,百度一下就知道(支持国产 ) import syssource = [1,2,3,4,5,6,7,8,9,10] #must be in orderdes = int(s ...

  7. python实现二分查找(折半查找)算法

    python实现二分查找算法 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 查找又称折半 ...

  8. 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...

  9. 二分查找算法(递归+非递归)

    二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较: ...

  10. Java 二分查找算法及效率比较

    1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...

最新文章

  1. 算法---------路径总和
  2. navigation
  3. 显示mac电脑中隐藏的文件和文件夹
  4. ubuntu创建新用户并设置sudo权限
  5. 一步步将 SAP Commerce Mock 应用部署到 SAP BTP Kyma Runtime
  6. 前端学习(554):node实现登录和注册第二部分代码
  7. 【POJ - 2632】Crashing Robots(模拟)
  8. NOI数学之提高级:欧拉定理和欧拉函数
  9. 小米12 Ultra外观设计曝光:白色陶瓷机身 后置硕大相机模组
  10. (二十)WebGIS中图层树功能的设计和实现
  11. Ubuntu环境变量添加的安全方法
  12. 1、配置后台登录以及模板引入
  13. HttpClient如何解决302重定向问题
  14. MATLAB实现FFT算法
  15. 为什么要面向对象编程?
  16. ActiveMQ中Consumer特性详解与优化
  17. 抖音算法推荐机制详解
  18. JSP页面调用log4j写日志文件
  19. JSONP及Axios
  20. SpringBoot+Schedule 定时任务的配置开关

热门文章

  1. java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象
  2. mysql查询语法错误_MySQL内部联接查询语法错误
  3. linux 文件隐藏权限,linux文件基本权限、默认权限、隐藏权限和ACL权限
  4. torchvision.transforms
  5. python epoll多路复用技术_python网络编程——IO多路复用之epoll
  6. Markdown(六)——表格合并单元格增加标题
  7. C语言:输入一个华氏温度f,计算并输出对应的摄氏温度。计算摄氏温度的公式为:c=5/9*(f-32),输出取两位小数。
  8. 为什么表数据删掉一半,表文件大小不变?
  9. cmd使用SBT构建scala项目
  10. Tensor Flow V2:将Tensor Flow H5模型文件转换为tflite