了解阶乘递归

问题描述

是的。但是由于它是递归的,所以它的工作方式相反。我曾经有一个面试官这样向我解释:

说出事实(5):

 - fact(5) = 5 * fact(4)
           - fact(4) = 4 * fact(3)
                     - fact(3) = 3 * fact(2)   
                               - fact(2) = 2 * fact(1)
                                         - fact(1) = 1 * fact(0) 
                                                   - fact(0) = 1
                                                   // This is where your condition returns 1.

现在,假设-上面的符号代表回报。您基本上会返回-标志后的任何内容。因此,从最低的行返回1。然后,您实际上返回了1(1),即1 *1。因此,它发生在REVERSE级联中,例如:

 = 120
 - fact(5) = 5 * 24
           - fact(4) = 4 * 6 = 24
                     - fact(3) = 3 * 2 = 6  
                               - fact(2) = 2 * 1 = 2
                                         - fact(1) = 1 * 1 = 1
                                                   - fact(0) = 1

请记住,每当进行递归操作时,实际上所有操作都是相反的。这确实可以帮助您解决所有递归问题。

这实际上就是为什么尾递归和相关优化如此重要的原因。在内存中,这些调用中的每个调用都被延迟,并且直到其上方的调用(在图中下方)结束并返回之前,都无法返回。因此,非常深层的递归调用可能导致堆栈溢出,除非编译器/解释器通过将其转换为OP中的版本来对此进行优化,以使部分结果立即得到评估且不会延迟。Python不执行此优化,因此您必须谨慎对待递归调用

解决方法

我正在查看递归的阶乘示例,并想确保我正确理解了它!

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

我说的对吗?

阶乘(4)=阶乘(4-1) 4 =阶乘(3-1) 3 * 4 =阶乘(2-1) 2 * 3 * 4 =阶乘(1-1) 1 * 2 * 3 * 4 =
24

因为factorial(1-1)= factorial(0),这在基本情况下显示为1,然后我们乘以2,然后乘以3再乘以4。

那是正确的观察方式吗?

提前致谢!