python-24-初识递归函数与算法
前言
初识递归函数与算法,递归其实就是在函数内部调用自己,算法就是一个计算的方法,我们简单了解一下递归实现的二分查找算法。
一、初识递归
1、简单递归函数
- 1.如果是这样子,那么就停不下来,但python为了杜绝无限调用,就做了限制。
- 2.限制默认为:998,如下面函数所示。
- 3.递归不合适解决次数很多,因为占内存,但递归能让代码更简单
RecursionError:递归错误,是超出了递归的最大深度。
# 1、简单递归函数: n = 0 def func(): global n n += 1 print(n) func() func()
2、修改递归最大的深度:sys.setrecursionlimit
最大深度与自己的电脑配置有关,性能好点的电脑应该是可以多跑点的。不要随意改动,python从内存角度出发做了限制,肯定是有它的好处!
# 2、修改递归最大的深度:sys.setrecursionlimit import sys sys.setrecursionlimit(100000) n = 0 def func(): global n n += 1 print(n) func() func()
3、递归实例:
看例子我们知道只要知道D是多少头猪,我们都能算出ABC家的数量了
# 3、递归实例 ''' A:我家比B多三头,你们猜我家有几头猪? n=1 head(1)=head(2)+2 =head(n+1)+2 B:我家比C家多三头。 n=2 head(2)=head(3)+2 =head(n+1)+2 C:我家比D家多三头。 n=3 head(3)=head(4)+2 =head(n+1)+2 D:我家有15头猪 n=4 head(4)=15 ''' def head(n): if n == 4: return 15 elif n>0 and n<4: return head(n+1)+3 print('n=1:', head(1)) print('n=2:', head(2)) print('n=3:', head(3)) print('n=4:', head(4))
4、看懂递归,如下图所示:
# 4、看懂递归 def head(1): # 我自己的函数传参是:1,所以先将 n=1 传入head函数内。 if 1 == 4: return 15 elif 1>0 and 1<4: return head(1+1)+3 # head(1+1),到这一步调用了 head(2) def head(2): # head(2) ,所以将2传入下面的函数n if 2 == 4: return 15 elif 2>0 and 2<4: return head(2+1)+3 # head(2+1),到这一步调用了 head(3) def head(3): # head(3) ,所以将3传入下面的函数n if 3 == 4: return 15 elif 3>0 and 3<4: return head(3+1)+3 # head(4) ,所以将4传入下面的函数n def head(4): if 4 == 4: # 4 == 4,所以知道了,head(4)=15,将15返回给上一次调用的head(3)中 return 15 elif 4>0 and 4<4: return head(4+1)+3 print('n=1:', head(1))
二、初识算法
1.二分查找算法实例:
特点:必须处理有序的列表,每次处理中间值来判断大了还是小了,对应放向再次处理中间值...
# 查找我输入的数字,每次该向哪边找? def find(lst, aim): mid = len(lst) // 2 if aim < lst[mid]: print(aim,'小于了中间值%s所以向左继续找' % lst[mid]) new = lst[:mid] find(new, aim) elif aim > lst[mid]: print(aim,'大于了中间值%s所以向右继续找' % lst[mid]) new = lst[mid+1:] find(new, aim) else:print('最终找到:', aim) lst = [1, 2, 4, 6, 12, 23, 33, 56, 66, 67, 89, 92, 105] find(lst, 67)
2.基于上面实例,我需要知道索引下标该怎么办呢?
列表本身的元素个数是不能改变了,那么我们可以通过变量来计算出。
# 我想知道这个索引的下标是多少 def find(lst, aim, start=0, end=None): end = len(lst) if end is None else end mid_index = (end-start) // 2 + start if start < end: if aim < lst[mid_index]: return find(lst, aim, start=start, end=mid_index-1) elif aim > lst[mid_index]: return find(lst, aim, start=mid_index+1, end=end) else:return'最终找到:%s,下标为:%s' % (aim, mid_index) else:return '找不到该值:%s' % aim lst = [1, 2, 4, 6, 12, 23, 33, 56, 66, 67, 89, 92, 105] ret = find(lst, 33) print(ret)
欢迎来大家QQ交流群一起学习:482713805