是的。但是由于它是递归的,所以它的工作方式相反。我曾经有一个面试官这样向我解释:
说出事实(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不执行此优化,因此您必须谨慎对待递归调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)