我比较了循环和递归的运行时间,发现循环速度更快,同时没有遇到RecursionError的问题。为什么会这样,循环这么快?
def factorial(n):
if n == 0:
return n
else:
return n + factorial(n-1)
%%timeit -n1000 -r10000
factorial(1000)
每个循环163 µs±13.2 µs(平均±标准偏差,每10000次运行,每个循环1000次)
def factorial2(n):
r = 0
for i in range(n+1):
r += i
return r
%%timeit -n1000 -r10000
factorial2(1000)
最慢的奔跑时间比最快的奔跑时间长9.46倍。这可能意味着正在缓存中间结果。 每个循环58.7 µs±25.2 µs(平均±标准偏差,每10000次运行,每个循环1000次)
谢谢,祝您编程愉快!
答案 0 :(得分:1)
通常,除非专门设计了一种编程语言来支持快速递归,否则递归总是较慢。当程序进行函数调用时,将创建一个新的堆栈框架,其中存储了所有局部变量和其他内容。在迭代过程中,所有事情都发生在单个堆栈框架内。
有一种叫做“尾递归”的东西,其中编写函数的方式使得计算结果始终在最后一帧中可用-因此,从理论上讲,只有一个堆栈帧就足够了。在某些语言中,编译器会识别这种情况,并将递归转换为“幕后”的迭代-这种类型的递归确实与迭代一样快。不幸的是,Python3不支持尾递归。