对于因子计算的递归内部函数感到困惑
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
这很奇怪。我错过了什么吗?
答案 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。
完成。