Python 这两种方法都正确使用递归吗?一个比另一个好吗?

Python 这两种方法都正确使用递归吗?一个比另一个好吗?,python,python-3.x,recursion,Python,Python 3.x,Recursion,我试图更好地理解递归 例如,以下是计算n!的两个定义: def factorial(num, p=1): if num == 0: return p else: p *= num return factorial(num-1,p) 及 一个比另一个好吗?我知道第二个构建了一个调用堆栈,而第一个是在每一步计算p,并将其传递给函数的另一个迭代。这些类型的函数是否有单独的名称?第一个不是递归吗 只是想了解一下这里的差异。谢谢 两者之间几

我试图更好地理解递归

例如,以下是计算n!的两个定义:

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

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


只是想了解一下这里的差异。谢谢

两者之间几乎没有区别。我会说“越简单越好”,第二个包含的变量越少,所以我会选择那个

或者更简单的事情:

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

def factorial(N):如果前者是尾部调用递归,则返回max(1,N),可以对其进行优化,但在CPython中未进行优化。@juanpa.arrivillaga谢谢!知道“尾部调用递归”这个名字肯定会有帮助。。。我可以用它做更多的研究。@CristiFati这太完美了!但愿我能在发帖之前找到它。谢谢大家!@戴维德。请理解,CPython不进行尾部调用优化
  def factorial(N): return max(1,N) if N<3 else N*factorial(N-1)