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不存在

 

                                                   欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生

  

posted @ 2016-06-08 22:22  财经知识狂魔  阅读(292)  评论(0编辑  收藏  举报