【问题标题】:When Is Recursion Useful? [duplicate]递归什么时候有用? [复制]
【发布时间】:2018-04-09 06:36:48
【问题描述】:

我对 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 循环而不使用递归的情况?

【问题讨论】:

  • 所有递归都可以重构为使用循环和其他类似的结构。递归有时会更容易阅读和理解
  • 递归非常适合导航树数据结构之类的事情。你如何导航一棵树?从根开始,导航树的左子节点,导航树的右子节点。你如何引导孩子? 与浏览根目录的方式完全相同。 所以在这里使用递归很方便。堆栈跟踪您在树中的位置;您不必明确地跟踪它。当你想出一个适合以这种方式解决的问题的递归解决方案时,它几乎就像魔术一样。 “就是这些吗?”是的,是的。
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topichow to ask 在这里申请。网上有很多关于这个的讨论...

标签: python python-2.7 loops recursion


【解决方案1】:

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

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)

所以你可以在某些时候看到像语法糖一样的递归,但取决于你想要什么,你需要决定是否使用。当您在Low-level programming language 中编程时,不使用递归,当您对微处理器进行编程时会出现很大错误,但在其他情况下,最好使用递归解决方案以更好地理解您的代码。

希望对您有所帮助,但您需要深入阅读书籍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 2013-02-13
    • 1970-01-01
    • 2014-10-25
    • 2020-04-03
    • 2015-01-13
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多