(1)定义:函数在调用的过程中 直接或者间接调用本身
例如:
(1)直接调用函数本身
def index(): print(‘递归函数‘) index() # 在函数内部再次调用函数本身 index()
(2)间接调用函数
def index(): print(‘递归函数‘) func() def func(): print(‘间接调用函数‘) index() # 调用上输入index 但是index内部又含有本部的函数调用方式 func()
(2)函数调用最大深度:
作用:当函数递归调用的时候 在局部依旧会开辟一个名称空间 无限次调度占用内存 为了解决内存占用 python对函数最大递归做了限制
(1)默认最大限制1000 但是不精确 而且可以手动更改最大限制
(2)基本限制范围在997/998左右
例如:
import sys sys.getrecursionlimit() def index(n): print(‘检测递归次数‘,n) index(n+1) # 每次调用函数次数+1 index(1) # 检测次数 998
PS:无限制递归相当于死循环没有意义
(3):递归函数调用的过程
(1)回溯过程:逐层从外向内查找,明确一个结束条件,查找的过程就是逐渐靠近结束条件的过程
(2)递推过程:从结束条件 向外部逐渐逆推
例如:
‘‘‘ PS:案例一 递归查找年龄的过程 age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18 ‘‘‘ # def index(n): if n == 1: # 结束条件 return 18 return index(n-1)+2 # 递归调用函数 res = index(5) print(res) # PS:案例二 循环打印容器类型 number = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] def index(number): for i in number: if type(i) is int: # 如果取值的类型是整形打印 print(i) else: # 否则重新调用函数进行打印 index(i) index(number)
算法:能够高效率的解决某些问题
例如:
l = [1,3,5,12,57,89,101,123,146,167,179,189,345] num = 167 for i in l: if num == i: print(‘找到啦‘) # PS:如果数字在尾部 依次循环打印效率会很低
二分法:
基本思路:
(1)必须有有大小顺序
(2)从中间将列表切分 取出中间值 和目标值进行比较 通过比较如果相等直接切分 否则继续切分比较
例如:
l = [1,3,5,12,57,89,101,123,146,167,179,189,345] target_num = 101 def index(l,target): middle_num = len(l)//2 # 将列表平均切分 if target_num > l[middle_num]: # 比较目标函数和中间函数大小 num_right = l[middle_num + 1:] # 大于则向右边切分 index(num_right,target_num) # 再次比较切分之后的大小 elif target_num < l[middle_num]: num_left = l[0:middle_num] index(num_left,middle_num) else: print(‘find it‘) index(l,target_num) # find it
原文:https://www.cnblogs.com/SR-Program/p/11177278.html