递归
递归
特点:
递归算法是一种直接或者间接的调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的
递归算法的特点:
1.递归就是在过程或者函数里调用自身
2.在使用递归策略时,必须由一个明确的递归结束条件,称为递归出口
3.递归算法解题通常显得简洁,单递归算法解题的运行效率低,所以一般不提倡用递归算法设计程序
4.在递归调用的过程当中系统为每一层的返回点、局部变量等开辟了栈来存储。递归次数过多容易造成栈溢出等
5.递归函数在递归解题完成后,函数内部还会逐层回退至退出
''' 要求: 递归算法所体现的"重复"一般有三个要求 1.每次调用在规模上都有缩小(通常是减半) 2.相邻两次重复直接有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入) 3.在问题的规模极小时必须用直接给出解答,而不进行在递归调用,因而每次递归调用的是有条件的(以规模未达到直接解答的大小为条件), 无条件递归调用会成为死循环,而不能正常结束 ''' #例子: def calc(n): print(n) if n/2 >1: #递归函数的出口 return calc(n/2) #函数返回值为自己,传参为(当前参数除以2) ret = calc(10) #调用calc函数并传入参数 print(ret) #查看返回值
#递归实现斐波那契数列 def func(num1,num2,stop): if num1 == 0: #限定从0开始 print(num1,num2) num3 = num1 + num2 #第一个数加上第二个数 print(num3) if num3<stop: #stop限定最大值 func(num2,num3,stop) #递归自己,传入参数func(num2,num2+num3,stop) func(0,1,2000) #二分查找 ''' 利用二分查找,找出一个列表中的某个数字 说明: 一般查询列表中某一位数字,可用循环遍历的方式从头到尾查找一遍,但如果数据量非常大这样是非常耗时的 二分查找法: 1.把列表的长度除以2取一个中间值,判断中间是大于或者小于需要查找的数字 2.如果中间值大于需要查询的数字则继续用此方法往左边查找 3.如果中间值小于需要查询的数字则继续用此方法往右边查找 4.递归此方法,直到查询出结果 ''' def binary_search(data_source,find_n): mid = int(len(data_source) / 2) #获取列表长度的中间位置 if len(data_source) >=1: #列表长度小于1表示没有内容了 if data_source[mid] > find_n: #中间值>查询值,继续往左边找 print("data in left of [%s]"%data_source[mid]) binary_search(data_source[:mid],find_n) #往左切片在递归 elif data_source[mid] < find_n: #中间值<查询值,继续往右边找 print("data in right of [%s]"%data_source[mid]) binary_search(data_source[mid:],find_n) #往右切片结果在递归 else: print("found find [%s]"%data_source[mid]) else: print("cannot find ...") data = list(range(1,600)) binary_search(data,70)