• 022,递归


    022,递归

    递归:迭代的深度
    尝试一下以下代码: 
    >>> def recursion():
        return recursion()
     
    >>> recursion()
    Traceback (most recent call last):
      File "<pyshell#3>", line 1, in <module>
        recursion()
      File "<pyshell#2>", line 2, in recursion
        return recursion()
      File "<pyshell#2>", line 2, in recursion
        return recursion()
      File "<pyshell#2>", line 2, in recursion
      
      .....
      
      File "<pyshell#2>", line 2, in recursion
        return recursion()
      File "<pyshell#2>", line 2, in recursion
        return recursion()
    RuntimeError: maximum recursion depth exceeded
    >>> 
     会发现貌似进入了一个死循环,需要强制停止,错误信息为:超过了python规定递归的最大深度。。

    要设置递归的深度,需要引入一个模块
     
    >>> import sys
    >>> sys.setrecursionlimit
    <built-in function setrecursionlimit>
    >>> sys.setrecursionlimit(1000000)
     
     用递归求阶乘
    写一个求阶乘的函数
     1、正整数阶乘指从1乘于2乘于3乘于4一直乘到所要求的数。
    2、例如给的数是5,则阶乘式是1X2X3X4X5,得到的积是120,所以120就是4的阶乘。
     
    #法。。。我居然不会。。。
    def fun(x):
        result = x
        for i in range(1,x):
            result *= i
        return result
            
            
    print(fun(5))
     
    递归算法: 
    def factorial(n):
        if n == 1:
            return 1
        else:
            return n * factorial(n-1)
        
    number = int(input(''))
    result = factorial(number)
    print('%d %d' % (number, result))

    #等差数列递归写法
    def ArithmeticPro(n):
        if n == 1:
            return 1
        else:
            return n + ArithmeticPro(n-1)
        
    number = int(input('请输入一个大于0的正整数:'))
    result = ArithmeticPro(number)
    print('1+2+3+ ...  +%d 的和是:%d' % (number, result))
    

    运行结果

    请输入一个大于0的正整数:258
    1+2+3+ ...  +258 的和是:33411
    

    注:该部教难理解。需加强练习!


    由于这方面概念不太理解,google一下,看到以下这段:

    这里插入一些关于递归的网方解释,因为我是从网上搜到的这些内容:
    (1)递归就是在过程或函数里调用自身;
    (2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

    递归算法一般用于解决三类问题:
    (1)数据的定义是按递归定义的。(比如Fibonacci函数)
    (2)问题解法按递归算法实现。(回溯)
    (3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)   

    递归的缺点:递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。 

    【推荐】网文《精通递归程序设计》:
    http://www.ibm.com/developerworks/cn/linux/l-recurs.html

    递归程序的基本步骤,来自上面这篇文章

    每一个递归程序都遵循相同的基本步骤: 
    1.初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。 
    2.检查要处理的当前值是否已经与基线条件相匹配(base case)。如果匹配,则进行处理并返回值。 
    3.使用更小的或更简单的子问题(或多个子问题)来重新定义答案。 
    4.对子问题运行算法。 
    5.将结果合并入答案的表达式。 
    6.返回结果。

    基线条件(base case)。基线条件是递归程序的最底层位置,在此位置时没有必要再进行操作,可以直接返回一个结果。所有递归程序都必须至少拥有一个基线条件,而且必须确保它们最终会达到某个基线条件;否则,程序将永远运行下去,直到程序缺少内存或者栈空间。

  • 相关阅读:
    548
    zookeeper的异常处理(Disconnected, SyncConnected, Expired)
    ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边)
    SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。
    查看mysql数据库版本方法总结
    Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    Ignite用户配置管理介绍
    ORACLE动态采样分析
    SQL SERVER 2012链接到SQL SERVER 2000的问题解决案例
    SQL SERVER 2005删除维护作业报错:The DELETE statement conflicted with the REFERENCE constraint "FK_subplan_job_id"
  • 原文地址:https://www.cnblogs.com/fishdm/p/3574084.html
Copyright © 2020-2023  润新知