13.递归函数

作者: Stone_説 | 来源:发表于2020-12-20 17:58 被阅读0次

目录:
1.递归的介绍
2.fibonacci数列
3.递归和循环的比较

1.递归的介绍

函数直接或间接调用自身就是递归
递归需要有边界条件、递归前进段、递归返回段
递归一定要有边界条件

2.fibonacci数列

2.1循环实现
[root@node05 python]# vim test.py 
a=0
b=1
print(a,b,end=' ')
for i in range(5):
    a,b = b,a+b
    print(b,end=' ')
[root@node05 python]# python3 test.py 
0 1 1 2 3 5 8 
2.2递归实现
[root@node05 python]# vim test.py 
def fib(n):
    return 1 if n < 2 else fib(n-1) + fib(n-2)
for i in range(7):
    print(fib(i),end=' ')
[root@node05 python]# python3 test.py 
1 1 2 3 5 8 13

递归要求:
递归一定要有退出条件,递归调用一定要执行到这个退出条件
没有退出条件的递归调用,就是无限调用

递归调用的深度不宜过深
Python对递归调用的深度做了限制,以保护解释器
超过递归深度限制,抛出RecursionError:maxinum recursion depth exceeded超出最大深度
sys.getrecursionlimit()

3.递归和循环的比较

3.1for循环
[root@node05 python]# vim test.py 
import datetime
start = datetime.datetime.now()
pre = 0
cur = 1
print(pre,cur, end=' ')
n = 35
for i in range(n-1):
    pre, cur = cur, pre + cur
print(cur, end=' ')
delta = (datetime.datetime.now()-start).total_seconds()
print(delta)
[root@node05 python]# python3 test.py 
0 1 9227465 2.5e-05
3.2递归实现
[root@node05 python]# vim test.py 
import datetime
pre = 0
cur = 1
print(pre,cur, end=' ')
n = 35
start = datetime.datetime.now()
def fib(n):
    return 1 if n < 2 else fib(n-1) + fib(n-2)
for i in range(n):
    num = fib(i)
print(num, end=' ')
delta = (datetime.datetime.now() - start).total_seconds()
print(delta)
[root@node05 python]# python3 test.py 
0 1 9227465 5.254317

递归的性能分析:
循环稍微复杂一些,但是只要不是死循环,可以多次迭代出最终结果
递归函数代码极其简单易懂,但是只能获取到最外层的函数调用,内部递归结果都是中间结果。而且给定了一个n都要进行近2n次递归,深度越深,效率越低。为了获取斐波那契数列需要外面在套一个N次的循环,效率就更低了。
递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快就溢出了

3.3递归的优化
import datetime
start = datetime.datetime.now()
pre = 0
cur = 1 # No1
print(pre, cur, end=' ')
def fib(n, pre=0,cur=1): # recursion
    pre, cur = cur, pre + cur
    print(cur, end=' ')
    if n == 2:
        return
    fib(n-1, pre, cur)
fib(35)
delta = (datetime.datetime.now()-start).total_seconds()
print(delta)
[root@node05 python]# python3 test1.py 
0 1... 9227465 5.4e-05

总结:

改进后的fib函数和循环思想类似,参数n是边界条件,用n来计数
前一次的计算结果直接作为函数的实参,效率较高
和循环比较,性能相近。

相关文章

  • 13.递归函数

    目录:1.递归的介绍2.fibonacci数列3.递归和循环的比较 1.递归的介绍 函数直接或间接调用自身就是递归...

  • Day10递归函数、模块、迭代器、生成器

    一、递归函数 1、什么是递归函数 在函数中调用函数本身的函数就是递归函数。 2、递归的作用 循环能做的递归都能做 ...

  • day11 函数(3)

    递归函数 实际开发的时候,能不用递归就不用 什么是递归函数 函数中调用函数本身的函数就是递归函数 递归的作用: 循...

  • python 递归函数

    递归函数 递归函数 : 在函数的调用自身 递归边界 : 退出递归的终止条件 例1,函数func如果没有设备递归边界...

  • day11-日常(递归函数、模块、迭代器、生成器)

    递归函数(实际开发的时候,能不用递归就不用) 1.什么是递归函数 函数中调用函数本身的函数就是递归函数 2.递归的...

  • 2019-01-07day11学习总结

    递归函数 实际开发的时候能不用递归就不用递归 1. 什么是递归函数 函数中调用函数本身的函数就是递归函数 2. 递...

  • 递归函数、模块、生成器、迭代器

    一、递归函数 实际开发的时候,能不用递归就不用 1.什么是递归函数 函数中调用函数本身的函数就是递归函数 2.递归...

  • day 11总结

    递归函数 实际开发的时候,能不用递归就不用1.什么是递归函数函数中调用函数本身的函数就是递归函数 2.递归的作用:...

  • Day11笔记

    实际开发的时候,能不用递归就不用 递归函数 1.什么是递归函数函数中调用函数本身的函数就是递归函数 2.递归的作用...

  • day11 生成器迭代器

    一、递归函数 1.什么是递归函数在函数中调用函数本身的函数就是递归函数 2.递归的作用:循环能做的事,递归都能做 ...

网友评论

    本文标题:13.递归函数

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