美文网首页
Python递归函数

Python递归函数

作者: 海龙_Lewis | 来源:发表于2017-07-24 11:33 被阅读0次

    <b>简单的来定义下这个递归函数,通俗点讲就是一个函数在内部调用自身,这个函数就是递归函数。
    bb is cheap , show me the code .

    个人学习理论,先定义在code在bb

    来用一段代码以及剖析运行过程,来理解python递归函数。
    比如我们要实现一个计算的函数,就比如说,定义参数为10,那么这个函数就要负责计算
    10 * 9 * 8 ………… * 3 * 2 * 1 的结果。

    先用常规方法:

    #!/usr/bin/env python
    #auther:Lewis
    sum1 =1
    for i in range(1,101):
        sum1 = i*sum1
    print(sum1)
    

    简述常规方法运行过程:

    sum = 1
    进入for 循环,迭代1----100的之间的数
    for i in range:
    i = 1
    i = 2
    i = 3
    i = 4
    i = 5
    ...
    i = 100
    每一个临时变量i都是一个新的值。
    sum1 = sum1 * i 这样写是为了清楚运算逻辑,更简便的写法是
    sum1 *= i
    每一次sum1 * i 的结果都会存到全局变量sum1里面
    (根据for循环,全局变量的值 是不断变化的)
    循环结束,按顺序打印sum1的值

    使用递归函数方法:

    def sum_lewis(n):
        if n <=0:
            return 'sorry,must be >=1'
        if n == 1:
            return 1
        return n * sum_lewis(n-1)
    print(sum_lewis(100))
    

    简述递归函数方法运行过程

    先定义一个名为sum_lewis的函数,并指定一个n的形参
    例行判断如果参数为0就返回提示,如果参数为1就返回1
    经过双层判断之后(增加程序容错率),在返回一个计算方式。 n * sum_lewis(n-1) 在返回值中再次调用该函数本身,这种行为就可以把他称作递归函数。
    ===> sum_lewis(5)
    ===> 5 * sum_lewis(4)
    ===> 5 * (4 * sum_lewis(3))
    ===> 5 * (4 * (3 * sum_lewis(2)))
    ===> 5 * (4 * (3 * (2 * sum_lewis(1))))
    ===> 5 * (4 * (3 * (2 * 1)))
    ===> 5 * (4 * (3 * 2))
    ===> 5 * (4 * 6)
    ===> 5 * 24
    ===> 120
    以上为如果参数为5的,运行推断过程。

    小结

    <b>使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
    针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
    Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
    作者邮箱:devopslewis@outlook.com
    微信:Stephen_403 文章有任何问题、错误、版权可以联系作者及时更正

    相关文章

      网友评论

          本文标题:Python递归函数

          本文链接:https://www.haomeiwen.com/subject/auavkxtx.html