zoukankan      html  css  js  c++  java
  • 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不存在
    

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

                                                                                 笔者:拍省先生

      

  • 相关阅读:
    常用模块的作业
    一些常用的模块
    软件开发的目录规范

    匿名函数作业
    模块
    算法,面向过程与匿名函数
    生成器表达式作业
    C. Perfect Keyboard
    C. Ehab and Path-etic MEXs
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5561814.html
Copyright © 2011-2022 走看看