一、算法概念

算法:就是一个计算过程,解决问题的方法。

二、递归

2.1、递归特点

递归算法是一种直接或间接调用自身算法的过程,在计算机编程中,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1)递归就是在过程或函数里调用自身。
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。
(4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了新栈来存储,递归次数过多容易造成栈溢出等。
递归的要求
递归算法所体现的“重复”一般有三个要求:
(1)每次调用在规模上都有所缩小(通常是减半)。
(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)。
(3)在问题的规模极小时必须直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。

2.2、简单的递归函数实例:

def recursion(i):   #定义函数print(i)if i/2 > 1:   #判断递归条件,退出re = recursion(i/2)  #递归函数自身print('返回值:',re)print('上层递归值:',i)return i     #返回值recursion(10)#运行原理:首先运行函数传参10给函数,打印10,判断条件满足,递归
#函数参数值为(10/2)5,打印i的值5,等递归到1.25时,判断条件不满
#足后,才打印上层递归的值,此时递归的值为1.25,return递归最后一
#层的值1.25,退出最后一层递归,继续一层层退出递归,最后返回最上层
#递归值结束函数。
'''
10
5.0
2.5
1.25
上层递归值: 1.25
返回值: 1.25
上层递归值: 2.5
返回值: 2.5
上层递归值: 5.0
返回值: 5.0
上层递归值: 10
'''

斐波那契数列:就是前两个数的和为后一个数的值(0,1,1,2,3,5,8,13…)

def foo(arg1,arg2,stop):if arg1 == 0:print(arg1,arg2)arg3 = arg1 + arg2print(arg1,arg2,arg3)if arg3 < stop:      #判断套件不满足时退出递归foo(arg2,arg3,stop)   #递归函数,传送参数arg2,arg3,stop给arg1,arg2,stopfoo(0,1,50)'''
0 1
0 1 1
1 1 2
1 2 3
2 3 5
3 5 8
5 8 13
8 13 21
13 21 34
21 34 55
'''

利用切片递归方式,查找数据:

def twosplit(sourceDate,findData):sp = int(len(sourceDate)/2)  #序列长度if sourceDate[0] == findData:print('找到数据:',sourceDate[0])return 0else:if findData in sourceDate[:sp]: #判断在左边print('数据在左边[%s]' %sourceDate[:sp])twosplit(sourceDate[:sp],findData)  #递归函数elif findData in sourceDate[sp:]: #判断在右边print('数据在右边[%s]' %sourceDate[sp:])twosplit(sourceDate[sp:], findData)else:print('找不到数据')if __name__ == '__main__':data = [1,2,'c',3,4,5,6,7,8,17,26,15,14,13,12,11,'a','b']#data = list(range(1000000))twosplit(data,'c')

二位数组,顺时针90度数据调换:

a = [[col for col in range(4)] for row in range(4)]
for i in a:print(i)   #打印二维数组
print('--------------------')
for lf,rig in enumerate(a):  #循环数组,打印数组下标和元素for cf in range(lf,len(rig)):  #从下标数组开始循环到列表长度 tmp = a[cf][lf]      #存储列表元素中的元素a[cf][lf] = rig[cf]  a[lf][cf] = tmpprint('+++++++++++++++++')for i in a:print(i)'''
#另一种方法
for i in range(len(a)):ai = [a[i][i] for row in range(4)]print(ai)
'''

2.3、递归原理

函数调用时,函数会开一个新栈,在新栈中执行这个函数体中的代码。
2.3.1、print() 语句在递归前
在函数调用前的代码会依次执行完之后再执行后面的函数调用。

2.3.2、print() 语句在递归后
在函数调用后的代码会等到函数所有调用执行完之后再从里到外依次执行。

2.4、错误处理

  1. maximum recursion depth exceeded(超过最大递归深度) 解决方式
import syssys.setrecursionlimit(1000000) #例如这里设置为一百万

三、二分查找

每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大; 必须是有序列表才可以使用二分查找。

# 1.非递归算法def binary_search(lis, nun):left = 0right = len(lis) - 1while left <= right:   #循环条件mid = (left + right) // 2   #获取中间位置,数字的索引(序列前提是有序的)if num < lis[mid]:  #如果查询数字比中间数字小,那就去二分后的左边找,right = mid - 1   #来到左边后,需要将右变的边界换为mid-1elif num > lis[mid]:   #如果查询数字比中间数字大,那么去二分后的右边找left = mid + 1    #来到右边后,需要将左边的边界换为mid+1else:return mid  #如果查询数字刚好为中间值,返回该值得索引return -1  #如果循环结束,左边大于了右边,代表没有找到lis = [11, 32, 51, 21, 42, 9, 5, 6, 7, 8]print(lis)lis.sort()print(lis)while 1:num = int(input('输入要查找的数:'))res = binary_search(lis, num)print(res)if res == -1:print('未找到!')else:print('找到!')# 2.递归算法def binary_search(lis, left, right, num):if left > right: #递归结束条件return -1mid = (left + right) // 2if num < lis[mid]:right = mid -1elif num > lis[mid]:left = mid + 1else:return midreturn binary_search(lis, left, right, num)#这里之所以会有return是因为必须要接收值,不然返回None#回溯到最后一层的时候,如果没有return,那么将会返回Nonelis = [11, 32, 51, 21, 42, 9, 5, 6, 7, 8]print(lis)lis.sort()print(lis)while 1:num = int(input('输入要查找的数:'))res = binary_search(lis, 0, len(lis)-1,num)print(res)if res == -1:print('未找到!')else:print('找到!')

Python 算法:递归 排序 查找相关推荐

  1. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  2. python算法题排序_python-数据结构与算法- 面试常考排序算法题-快排-冒泡-堆排-二分-选择等...

    算法可视化网站推荐---->visualgo 0.面试题中的排序算法 一些排序算法可能在工作中用的会比较少,但是面试却是不得不面对的问题.算法有助于提高我们对数据结构的理解以及提高自己的逻辑能力 ...

  3. python算法系列排序与查找_Python 排序与查找算法收集

    Python 语言实现几种不同的排序算法,代码来自于老男孩Python全栈开发,学习教程! import random import time import copy import sys def c ...

  4. Python算法——分治法查找数组中元素最小最大值

    要求: 给定数组a1,a2,a3,...an,找出数组中最大值和最小值.(数组中两两各不相同) 分析: 算法思想类似于上图,将数组两两分为一组,如果数组元素奇数个,就把最后一个元素单独分为一组,然后分 ...

  5. Python算法之二分查找

    二分查找就是每次都取中间值,来对要查找的值进行对比,不断缩小范围的过程. 例如: 我们利用一个猜数字的小游戏来举例,我们心里想一个范围是0-6的整数2,接下来把0-6的数组罗列[0,1,2,3,4,5 ...

  6. 结构与算法分享排序规则与查找算法

    一.递归算法 递归就是方法自己调用自己,每次调用时传入不同的变量,可以让代码变得简洁.递归算法在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,递归式方法可以被用于解决很多的计算 ...

  7. 查找算法与排序算法之Python实现

    查找算法与排序算法 查找算法 顺序查找 二分查找 排序算法 冒泡排序 选择排序 简单选择排序 选择排序 插入排序 快速排序 堆排序 堆排序topk问题 归并排序 希尔排序 计数排序 桶排序 基数排序 ...

  8. Java算法--第二章--查找与排序(2)递归基础--佩波那契最大公约数插入排序汉诺塔

    Java算法–第二章–查找与排序(2)递归基础 一.找重复 1.找到一种划分方法 2.找到递推公式或者等价转换 都是父问题转化为求解子问题 二.找变化的量 变化的量通常要作为参数 三.找出出口 代码: ...

  9. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

最新文章

  1. Windows注册与删除mysql服务
  2. “Python来玩微信跳一跳”教程(问题总结)
  3. HDU4473_Exam
  4. 人工智能岗位替代----办公文员
  5. 国内数据中心制冷系统设计与发展
  6. [reference]-ARM/TEE/security等论文中的缩写和参考文献
  7. C++代码片段(二)判断可变模板参数中是否包含某一特定类型
  8. Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?
  9. P1063-能量项链【区间dp】
  10. 2021年周边游数据报告
  11. Spring MVC核心知识
  12. 5个让人赞不绝口的微信小程序,拒绝占用手机内存!
  13. 抖音音乐品牌升级 推出“炙热星河”音乐人服务平台
  14. 台风怎么看内存颗粒_【无趣】使用300多元的D4 16G内存是种什么体验
  15. HCIE-Security Day33:IPSec:深入学习ipsec ikev2、IKEV1和IKEV2比较
  16. blender风格化草地
  17. 如何解读springboot 中约定大于配置、JPA是什么、咋用
  18. cyclone小知识(三)——cyclone导入多种格式数据
  19. 02_性能_内存调整_个人学习小结
  20. 【云速建站】网站的基本设置

热门文章

  1. 转、分享:PMP学习资料、考试资料推荐:第四版-2008版-吴永达
  2. 为什么显示芒果tv服务器异常怎么办,芒果TV显示MAC认证状态异常怎么办?
  3. java-php-python-科院垃圾分类系统计算机毕业设计
  4. 大佬们帮我看看这怎么弄
  5. 域格模块短信收发(PDU解析)
  6. 电子元件的基本参数及其温度特性
  7. C语言disc函数,【职场之道】DISC行为模式深入了解
  8. 一道大厂测试开发面试真题,你需要几分钟解答?
  9. 电动机综合保护器 电机过载保护器 马达缺相漏电保护装置
  10. 开源地图服务器Geoserver的安装部署