1、什么是函数的递归
函数的递归调用:一个函数运行中又间接调用的函数本身
def foo(): print('from foo') foo()
这是一个死循环,但python为了防止内存吃不消,设置了默认最高递归次数1000次就会报错。
递归必须要有两个明确的阶段:
递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少 回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,开始一层一层回溯举个例子 :
我问小明今年几岁,小明说:我比小王大2岁。让后我有接着问小王,小王说:我比小李大2岁。。。。(省略,算我偷懒吧)
接着问3次之后小左说:我18岁。
age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18
我们不难发现这是在一环扣着一环知道小左说出自己的年龄才能回溯小明的年龄
age (n) = age (n-1) + 2
age (1) = 18
这是上面的一个规律接下来我们运用下函数
def age(n): if n == 1: return 18 return age(n-1) + 2 print(age(5)) 》》26
2、为什么要用递归
递归可以总结说是一个循环据我所学的知识只有一个while 条件 循环 虽然说 可以解决问题但是对于有些应用场景太过于复杂
比如:l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
如果用while取得的就比较复杂,如果用递归的话就比较简单
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]] def foo (l): for item in l: if type(item) is list: foo(item) else: print(item) foo(l)
3、如何用递归
除了以上的玩法 递归还有一个玩法 就是:二分法
如果要一个列表非常多的数字,你要取出 一个,如果用for循环的话就会循环很久,
这样也是一种解决方法。
nums = [1, 3, 7, 11, 22, 34, 55, 78, 111, 115, 137, 149, 246, 371] def search(search_num, nums): if len(nums) == 0:#如果切分把列表里的值都没有的话,这个值就不在这里面 print('里面没有') return mid_index = len(nums) // 2#计算这个列表中间值 if search_num > nums[mid_index]:#判断输入的那个值是否大于中间值 nums = nums[mid_index + 1:]#如果大于就切开大于那边的区域ps:+1是中间那个值显然没必要去比了 search(search_num, nums)#继续上面的循环操作直到切出那个值 elif search_num < nums[mid_index]: nums = nums[mid_index + 1:] search(search_num, nums) else: print('找到了') search(44, nums)