我编写了两个程序来计算数字的阶乘。 1:
import time
x = int(input('>'))
t1 = time.time()
fact=1
if x==0:
print('undefined')
elif x==1:
print(1)
else:
while x!=1:
fact *= x
x -= 1
print(fact)
print(time.time()-t1)
2:
import time
def fact(n):
if n==0:
return 'undefined'
elif n==1:
return 1
else:
return n*fact(n-1)
x = int(input('>'))
t1 = time.time()
print(fact(x))
t = time.time()-t1
print(t)
第二个程序的平均运行时间少于第一个。现在我的问题是,哪一个确实比另一个更好,以及我们将方法2用于什么(不需要任何代码示例)。而且很抱歉,如果以前有人问过这个问题(可能是这个问题),我搜索了一段时间,但找不到。
答案 0 :(得分:1)
更好自然是一个主观术语。如评论中所述,就运行时复杂度而言,两者均以O(n)时间运行。但是,取决于语言的详细信息,递归函数通常会占用更多的内存空间。
具体来说,由于您似乎正在使用Python,因此每个递归调用都需要一个新的函数调用框架,以跟踪该函数调用的变量。与简单的循环相比,这将占用更多的空间,同时有效地占用相同的时间。实际上,为了限制深度递归的使用,默认情况下,Python的递归深度限制为1000;深度限制为1000。也就是您将无法以这种方式计算超过1000的数字的阶乘。
通常来说,哪个更好取决于语言。如果递归函数的空间不相等,则循环几乎总会占用较少的空间。但是,这并不意味着递归是没有用的!对于像阶乘函数这样的简单示例,根本不需要递归。但是,当您构建复杂的数据结构或算法时,为了编写解决方案,有时可能需要递归(如果不是非常干净的话)。
最终,递归和循环几乎相同。我更喜欢在
时使用递归树遍历,图遍历和排序都是最好的例子,递归可能是您的最佳选择