【问题标题】:Are both of these proper use of recursion? Is one better than the other?这些都是正确使用递归吗?这个比那个好吗?
【发布时间】:2019-11-04 18:11:09
【问题描述】:

我正在努力更好地理解递归。

例如,这里有两个计算n的定义! :

def factorial(num, p=1):
    if num == 0:
        return p
    else:
        p *= num
        return factorial(num-1,p)

def factorial(num):
   if num == 1:
       return num
   return num * factorial(num - 1)

一个比另一个更好吗?我知道第二个构建一个调用堆栈,而第一个是在每一步计算 p 并将其传递给函数的另一个迭代。这些类型的函数是否有单独的名称?第一个不是递归吗?

只是在此处寻找一些了解差异的指导。谢谢!

【问题讨论】:

  • 前者是尾调用递归,可以优化,但在CPython中没有优化。
  • @juanpa.arrivillaga 谢谢!知道“尾调用递归”这个名字肯定有帮助……我可以用它做更多的研究。
  • @CristiFati 这太完美了!希望我能在发布问题之前找到它。谢谢!
  • @DavidR。请理解,CPython 不做尾调用优化

标签: python python-3.x recursion


【解决方案1】:

两者差别不大。我会说“越简单越好”,而第二个涉及的变量更少,所以我会选择那个。

或者更简单的:

  def factorial(N): return max(1,N) if N<3 else N*factorial(N-1)

但在现实生活中,您不应该递归地实现它,因为迭代解决方案会更快。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多