python基础-第五篇-5.2递归
又是一个阳光明媚的日子,小白看着刚刚从东边升起的太阳,感觉太阳爷爷也在向她打招呼,小白就不经的微笑起来!心想:今天又会学到什么有趣的东西呢?有些小期待,也有些小激动!
小刘来得比小白还早,两辆相视而笑打了一下招呼!
小刘:小白!你过来,让你思考一下这段代码是怎么个执行过程?就当拿来给你早上提提神,醒醒脑的吧?
小刘:我要去早会!你把这个好好想想,等下我回来的时候告诉我!
小白点点头,小白打量这段代码:
def f1(): return 'f1' def f2(): r = f1() return r def f3(): r = f2() return r ren = f3()
小白把这个画的花花绿绿的,小白点着头,嘴里念叨着有点意思
小刘回来了,问她思考怎么样呢?
小白回答到:ren变量的结果为‘f1’,解释时从上往下解释,遇定义函数不执行,只是刷到内存,执行f3上下跑了个来回
小刘看了一下小白画的图,瞬间懂了,连忙夸奖小白:基础学的不错啊,没错就是你说的
小刘:那我再给你看一个例子,看你能悟出来么?
def f4(a1,a2): if a1 > 3: return print(a1) a3 = a1 + a2 f4(a2,a3) r = f4(0,1) print(r)
小白看了看,又画了起来
小白很快得出来答案,会打印0,1,1,2,3 函数返回默认值None
小刘哈哈大笑:小白!你回去吧!不用我教,都会了,回去自悟吧
小白笑了:笨人有笨法子,好时长,还需要你这位大神指点!
小刘接连问道:那你知道这个算法叫什么吗?
小白:好像叫递归,以前了解过一点
小刘:那你知道它的优缺点和定义吗?
小白摇摇头!
小刘:小白记好了
1.在过程或函数里调用自身
2.递归算法解题简洁易读,但效率低
3.在使用递归策略时,必须要有结束条件,而这个称为递归出口,最大递归深度为999层
小白感叹道:小小的一个递归这么多的学问啊
小刘:你还不知道你刚才你得出的那个数列叫做斐波那契数列吧?
小白:还真不知道
小刘:就是某个数等于前两项之和,我这边还有个设置递归深度的函数给你看看
def f5(depth,a1,a2): if depth == 10: return a1 a3 = a1 + a2 r = f5(depth+1,a2,a3) return r ret = f5(1,0,1) print(ret)
小刘:小白!这个弄明白了吧?
小白点点头
小刘:那我们接下来看一个更为复杂的例子,叫做二分法查找,用到原理就是递归原理
二分法查找
二分法查找又叫对半查找,前提是对有序数列进行查找,拿要查找的数和处在数据源中间的那项进行比较,每比较一次就排除一半
#二分法查找 lis = list(range(2,11,4)) print(lis) #[2, 6, 10] def semi_find(find_n,data_resources): i = int(len(data_resources)/2) #求得中间项的索引位置 if len(data_resources) >= 1: #递归终止条件 if data_resources[i] > find_n: #要查找的数处在前半部分 semi_find(find_n,data_resources[:i]) #排除后半部分 elif data_resources[i] < find_n: #要查找的数处在后半部分 if find_n < data_resources[i + 1]: #因为int对小数是向下取整,这样会排除i到i+1索引位置对应数之间的值 print('没这数!') #一旦要查找的数判定处于上面范围,就是输出没有这数 return else: semi_find(find_n,data_resources[i:]) #排除前半部分 else: print('%s in lis'%find_n) #如果等于中间数,就找到了 else: print('没有你这个数!') #加等号 semi_find(2,lis) #能找到2 semi_find(7,lis) #7,8,9超过最大递归层数也解决了 #不加等号 # semi_find(2,lis) #错误提示找不到2 # semi_find(7,lis) #能正确提示7,8,9不存在
欢迎大家对我的博客内容提出质疑和提问!谢谢
笔者:拍省先生