如何解决了解阶乘递归
是的。但是由于它是递归的,所以它的工作方式相反。我曾经有一个面试官这样向我解释:
说出事实(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。
那是正确的观察方式吗?
提前致谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。