对于因子计算的递归内部函数感到困惑

时间:2018-01-18 16:57:30

标签: python algorithm recursion

对于因子计算的递归内部函数感到困惑

Chocolatey v0.10.8
Installing the following packages:
libcairo2
By installing you accept licenses for the packages.
libcairo2 not installed. The package was not found with the source(s) listed.
 If you specified a particular version and are receiving this message, it is possible that the package name exists but the version does not.
 Version: ""
 Source(s): "https://chocolatey.org/api/v2/"

我感到困惑的是为什么在陈述>>> def factorial(n): ... def fac_iter(n, accum): ... if n <= 1: ... return accum ... return fac_iter(n - 1, n * accum) ... return fac_iter(n, 1) ... >>> factorial(5) 120 之前没有else。在我看来,这个递归函数return fac_iter(n - 1, n * accum)将永远迭代。我尝试添加fac_iter作为我的逻辑:

else

这很奇怪。我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您得到的错误是因为您混合了标签和空格,而不是因为您添加了else:。如果你一直使用空格你的加法工作:

>>> def factorial(n):
...     def fac_iter(n, accum):
...         if n <= 1:
...             return accum
...         else:
...             return fac_iter(n - 1, n * accum)
...     return fac_iter(n, 1)
...
>>> factorial(5)
120

else很好,但只是不需要

if测试为 true 时,下一条指令是return语句,退出函数。这意味着无论如何从未到达之后的任何代码都在线上。换句话说,只有在return测试为假时,无论是否有if块,都只会达到第二个else:行。

答案 1 :(得分:0)

您从n=5开始并致电def fac_iter(5, 1)

这将调用fac_iter(4, 5 * 1)

这将调用fac_iter(3, 4 * 5 * 1)

这将调用fac_iter(2, 3 * 4 * 5 * 1)

这将调用fac_iter(2, 3 * 4 * 5 * 1)

这将调用fac_iter(1, 2 * 3 * 4 * 5 * 1)

这将返回2 * 3 * 4 * 5 * 1

不需要else - n一直减少1,有时它将为1而if为真。然后返回累积,直到它调用自己的n比之前少1。

完成。