Python 循环还是递归

Python 循环还是递归,python,recursion,while-loop,Python,Recursion,While Loop,我写了两个程序来计算一个数的阶乘。 1: 2: 第二个程序的平均运行时间小于第一个程序。现在我的问题是,哪一个比另一个好,我们还使用方法2做什么(不需要任何代码示例)。我很抱歉,如果之前有人问过这个问题(很可能是这样),我搜索了一段时间,但没有找到它。更好当然是一个主观术语。如注释中所述,就运行时复杂性而言,两者都以O(n)时间运行。然而,根据语言的细节,递归函数通常会占用更多的内存空间 具体来说,由于您似乎正在使用Python,因此每个递归调用都需要一个新的函数调用框架,以跟踪该函数调用的变量

我写了两个程序来计算一个数的阶乘。 1:

2:


第二个程序的平均运行时间小于第一个程序。现在我的问题是,哪一个比另一个好,我们还使用方法2做什么(不需要任何代码示例)。我很抱歉,如果之前有人问过这个问题(很可能是这样),我搜索了一段时间,但没有找到它。

更好当然是一个主观术语。如注释中所述,就运行时复杂性而言,两者都以O(n)时间运行。然而,根据语言的细节,递归函数通常会占用更多的内存空间

具体来说,由于您似乎正在使用Python,因此每个递归调用都需要一个新的函数调用框架,以跟踪该函数调用的变量。这比简单循环占用的空间大得多,同时有效地占用了相同的时间。事实上,为了限制深度递归的使用,Python默认的递归深度限制为1000;aka,你不能用这种方法计算1000以上数字的阶乘

一般来说,哪种选择更好取决于语言。循环几乎总是比递归函数占用更少的空间。然而,这并不意味着递归是无用的!当涉及到像阶乘函数这样的简单示例时,递归根本不是必需的。然而,当您在构建复杂的数据结构或算法时,为了编写解决方案,递归有时是必要的,如果不是非常干净的话

最终,递归和循环几乎是一样的。我更喜欢在需要时使用递归

  • 递归解的实现比迭代解简单得多
  • 我可以肯定递归不会因为深入调用堆栈而导致堆栈溢出

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

    以什么方式更好?都在O(n)上运行,以提高运行时的复杂性。递归具有更大的内存复杂性:O(n^2)。很多编译器在你不知道的情况下将递归转化为迭代,这就是原因之一。我说的更好,是指哪一个在内存和处理能力方面更有效。当你得到计算速度最慢的一个一分钟时,最快的一个需要多长时间?方法2被限制为996递归深度,因此,我运行了6个测试,每个计算996!方法1。平均时间为0.03秒,而方法2。需要0.023s,但这是有限的方法1可以走得很远,直到我猜我们得到一个整数溢出。所以这取决于我尝试做什么,一个在某些情况下会表现更好,另一个不会。问题是,循环和递归实际上是一样的。一般的经验法则是,当1)它使代码更简单、更容易编写,2)您可以确保它不会因为深入不同的语言优化递归而导致堆栈溢出时,更喜欢递归。如果你感兴趣的话,你可以研究一下每个递归都可以转化为迭代,反之亦然。我主张在动态编程的情况下使用递归,以获得更干净的代码。但在实际情况中,如果不(不必要地)损害内存,就很难使用递归。
    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)
    
    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)