我一直在做Python难题,我一直在做的一个是使用并发函数来解决Python中的Kempner函数
应用于复合数的凯普纳函数允许找到大于零的最小整数,该整数的阶乘正好除以该数
凯普纳(6)➞ 3
1!=1%6>;0
2!=2%6>;0
3!=6%6==0
凯普纳(10)➞ 5
1!=1%10>;0
2!=2%10>;0
3!=6%10>;0
4!=24%10>;0
5!=120%10==0
有多种方法可以做到这一点,我看到的解决方案之一是:
def kempner(n, i=1, total=1):
if total % n == 0:
return max(1, i-1)
else:
return kempner(n, i+1, total*i)
我理解这是做什么的要点,但是当我通过调试模式运行它并查看变量在做什么时,我可以看到当达到基本条件(if total % n ==0
)并且返回return max(1, i-1)
时,else
子句中的所有内容都将继续运行,直到函数返回到其启动条件(例如kempner(10)
然后n = 10
,i = 1
,total = 1
)。为什么会这样?如果达到基本条件,它肯定应该停止复发
这是一个相当抽象的问题,显然是我知识中的一个盲点。如果有人有任何见解,我将不胜感激
递归调用与任何其他函数调用一样:当它们返回时,它们将控制权返回给调用它们的任何函数
假设您有一系列编号的递归调用:
如果递归调用3调用了递归调用4,并且递归调用4在基本情况下结束,那么从递归调用4返回将返回递归调用3,因为3调用了4。这与任何其他函数调用一样:
当您从
second_func
返回时,您将控制权返回到first_func
,因为first_func
调用了second_func
。您不会立即从second_func
返回到main
或其他地方。递归调用也是如此。处理递归时唯一的区别是first_func
和second_func
是相同的函数,但这并不影响返回机制没有办法(除了使用类似异常的东西)一次从整个调用链中退出
相关问题 更多 >
编程相关推荐