Python中递归和迭代阶乘程序的时间和复杂性测试
我尝试检查递归和迭代程序计算阶乘的内存复杂性 我假设解决方案是Python中递归和迭代阶乘程序的时间和复杂性测试,python,algorithm,Python,Algorithm,我尝试检查递归和迭代程序计算阶乘的内存复杂性 我假设解决方案是O(N),乘法的实现方式并不有趣 但当我比较递归和迭代两种情况的求解时间时,我得到了不同的结果 Time of execution of factorial (loop) : 521.7680931091309 Time of execution (recursive) : 1214.137077331543 导入时间 #O(n)复杂性 def阶乘(n): 结果=1 对于范围(1,n+1)内的i: 结果*=i 返回结果 #O(
O(N)
,乘法的实现方式并不有趣
但当我比较递归和迭代两种情况的求解时间时,我得到了不同的结果
Time of execution of factorial (loop) : 521.7680931091309
Time of execution (recursive) : 1214.137077331543
导入时间
#O(n)复杂性
def阶乘(n):
结果=1
对于范围(1,n+1)内的i:
结果*=i
返回结果
#O(n)复杂性
def阶乘记录(n):
如果n递归解比非递归解运行得慢。这是意料之中的。递归解决方案涉及大量的函数调用开销
两个O(n)
算法的运行时并不相同。它们具有相同的复杂性,但是O(n)
的定义涉及一个未指定的比例常数(在线性情况下,这只是直线的斜率)。并非所有直线都具有相同的坡度。递归情况的斜率刚好大于非递归情况的斜率。这样想吧。如果n=10
,则递归函数需要10次函数调用。如果n=20
,则需要20个函数调用,等等。请注意这是如何线性上升的,因此是斜率的一部分。在非递归情况下,没有与此成本相对应的内容。除了函数调用开销之外,计算主要是乘法(这在两种情况下是相同的)——因此递归函数的效率几乎明显较低。这会产生另一个函数没有的成本。您两次都使用factorial
而不是对其中一个函数使用factorial\u rec
,但这个问题仍然有意义。@johncolman请尝试执行。在您最初的问题中,运行时间似乎是相同的(这就是你似乎要问的,因为如果它们是的话,那将是令人惊讶的)。经过修改,你似乎在问为什么它们是不同的,尽管它们都是O(n)
。我同意这个问题是有道理的,尽管它是基于对big-O符号的误解。