递归何时有用?

时间:2017-10-27 15:35:34

标签: python python-2.7 loops recursion

我是python的新手,最近了解了递归。当我的任务是查找数字的阶乘时,我使用了这个:

def factorial(n):
    product = 1
    for z in xrange(1,n+1):
        product *= z
    return product

if __name__ == "__main__":
    n = int(raw_input().strip())
    result = factorial(n)
    print result

然后,因为任务是使用递归,我创建了一个使用递归的解决方案:

def factorial(n):
    if n == 1:
        current = 1
    else:
        current = n*(factorial(n-1))  
    return current

if __name__ == "__main__":
    n = int(raw_input().strip())
    result = factorial(n)
    print result

两者似乎都产生了相同的结果。我的问题是,为什么我会使用递归,如果我可以使用for循环呢?有没有我不能只创建for循环而不是使用递归的情况?

1 个答案:

答案 0 :(得分:0)

对于您通过递归找到的每个解决方案都有一个迭代解决方案,因为您可以使用堆栈模拟递归。

Factorial的例子使用一种名为Tail Recursion的递归,这种情况有一种简单的方法来实现迭代,但在这种情况下,递归解决方案更类似于数学定义。然而,还有其他问题发现迭代解决方案很难并且更强大且更具表现力使用递归解决方案。例如,河内塔的问题看到这个问题以获取更多信息Tower of Hanoi: Recursive Algorithm,这个问题迭代的解决方案非常繁琐,最后必须模拟递归。

Fibonacci sequence这样的问题,定义是递归的,很容易生成递归的解决方案

def fibonacci(n):
    if ((n==1) or (n==2)):
        return 1
    else (n>2):
        return fibonacci(n-2) + fibonacci(n-1)

这个解决方案是直截了当的,但是不必要地计算n-2的斐波纳契数,看下面的图像以更好地理解斐波纳契(7) fibonacci(7)

所以你可以在一段时间内看到语法糖的递归,但取决于你想要什么,你需要决定是否使用。当您在Low-level programming language中编程时,不使用递归,当您编写微处理器是一个很大的错误,但在其他情况下,最好使用递归解决方案来更好地理解您的代码。

希望这有帮助,但你需要深入阅读书籍。