python函数递归怎么理解,Python的递归
1、功能执行过程
(调用函数,保存当前内容,按堆栈函数,创建堆栈框架。执行里面的语句)
foo1、foo2、foo3和main的函数对象是在全局框架中生成的。(堆栈、先进先出、后进先出)。
主函数调用
在main中找到内置函数main to stack,将常量字符串堆栈,调用函数,弹出栈顶。
在main中,全局函数foo1推栈,推常数100和101,调用函数foo1,创建栈帧。打印函数栈,字符串和变量B和b1栈,调用函数,弹出栈帧,返回值。
在Main中,全局查找foo2函数进行堆栈,堆栈常数200,调用foo2,创建堆栈框架。FO3函数压栈,变量C引用栈,调用foo3,创建栈帧。Foo3在完成打印函数调用后返回。Foo2响应调用并在执行print后返回值。主foo2调用结束,弹出栈顶,主函数继续执行打印函数调用,弹出栈顶,主函数返回。
2.递归:当一个函数直接或间接调用自己时就是递归。
递归需要边界条件,递归前进段和递归返回段。
递归必须有边界条件。
当不满足边界时递归前进。
当满足边界条件时,它递归返回。
斐波那契数列:
pre=0
cur=1
print(pre,cur,end= )
n=4
对于范围内的I(n-1):
前,当前=当前,前当前
print(cur,end= )
定义纤维(n):
如果n2 else fib(n-1) fib(n-2)则返回1
对于范围(5)中的I:
print(fib(i),end= )
3.递归需求
递归必须有一个退出条件。递归调用必须执行到这个退出条件。没有退出条件的递归调用是无限调用。
递归的深度不能太深。
Python限制了递归调用的深度,以保护解释器。
如果超过递归调用深度,将引发异常。
4.递归的性能
循环稍微复杂一点,但只要不是无限循环,就可以迭代多次,直到计算出结果。
改进。左边的fib函数类似于loop的思想。
参数n是一个边界条件,按n计数。
最后一个计算结果作为下一个结果的实际自变量。
导入日期时间
n=35
start=datetime.datetime.now()
定义纤维(n):
如果n2 else fib(n-1) fib(n-1)则返回1
对于范围内的I(n):
print(fib(i),end= )
=(datetime . datetime . now()-start)。总计_秒()
打印(增量)
效率低。
pre=0
cur=1
print(pre,cur,end= )
定义纤维(n,pre=0,cur=1):
前,当前=当前,前当前
print(cur,end= )
如果n==2:
返回
光纤(n-1,前置,后置)
印刷(纤维(5))
#斐波那契数列的改进
左边的fib函数类似于loop的思想。
参数n是一个边界条件,按n计数。
最后的计算结果作为函数的实际参数。
非常高效
和循环相比,性能差不多,所以递归效率不一定低。但是深度有限。
5.间接递归
def foo1():
二氧化硫()
定义foo2():
f1oo()
foo1()
该函数本身被另一个函数调用。
但是,如果构成循环递归调用,那就非常危险了。
6.递归汇总
是很自然的表达,符合逻辑思维。
运行效率比较低,所以每次调用函数都要打开一个堆栈框架。
递归有深度限制。如果递归层次太深,函数反复压栈,栈内存很快就会溢出。
如果递归次数有限,可以使用递归调用或循环替换。循环代码略复杂,但只要不是无限循环,就可以多次迭代,直到计算出结果。
大多数递归可以通过循环来实现。
即使代码很简单,也可以不用递归来使用。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。