循环或递归

时间:2018-08-12 06:10:07

标签: python recursion while-loop

我编写了两个程序来计算数字的阶乘。 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用于什么(不需要任何代码示例)。而且很抱歉,如果以前有人问过这个问题(可能是这个问题),我搜索了一段时间,但找不到。

1 个答案:

答案 0 :(得分:1)

更好自然是一个主观术语。如评论中所述,就运行时复杂度而言,两者均以O(n)时间运行。但是,取决于语言的详细信息,递归函数通常会占用更多的内存空间。

具体来说,由于您似乎正在使用Python,因此每个递归调用都需要一个新的函数调用框架,以跟踪该函数调用的变量。与简单的循环相比,这将占用更多的空间,同时有效地占用相同的时间。实际上,为了限制深度递归的使用,默认情况下,Python的递归深度限制为1000;深度限制为1000。也就是您将无法以这种方式计算超过1000的数字的阶乘。

通常来说,哪个更好取决于语言。如果递归函数的空间不相等,则循环几乎总会占用较少的空间。但是,这并不意味着递归是没有用的!对于像阶乘函数这样的简单示例,根本不需要递归。但是,当您构建复杂的数据结构或算法时,为了编写解决方案,有时可能需要递归(如果不是非常干净的话)。

最终,递归和循环几乎相同。我更喜欢在

时使用递归
  1. 递归解决方案的实现比迭代解决方案简单得多
  2. 我可以确定递归不会太深地进入调用栈而不会导致堆栈溢出

树遍历,图遍历和排序都是最好的例子,递归可能是您的最佳选择