问题描述
我一直在做Python难题,而我一直在做的是使用并发函数来解决Python中的Kempner函数。
应用于复合数的Kempner函数允许找到大于零的最小整数,阶乘将精确地除以该数。
例如:
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
)和{{1}时返回},然后return max(1,i-1)
子句中的所有内容将继续运行,直到函数返回其起始状态为止(例如,对于else
,然后是kempner(10)
,n = 10
,{{1} })。为什么这样做呢?如果已经达到基本条件,是否应该停止复发?
这是一个相当抽象的问题,显然是我所知的盲点。如果有人有任何见识,我将不胜感激。
解决方法
递归调用与其他任何函数调用一样:当它们返回时,它们将控制权返回给调用它们的对象。
假设您有一系列编号的递归调用:
1 -> 2 -> 3 -> 4
Base Case Reached
如果递归调用3称为递归调用4,并且递归调用4在基本情况下结束,则从递归调用4返回将使您返回到递归调用3,因为3调用了4。这与任何其他函数调用一样:
def second_func():
print("Inner")
return 5
def first_func():
return second_func()
从second_func
返回时,您将控制权返回到first_func
,因为first_func
被称为second_func
。您不会立即从second_func
退出回到main
或其他情况。递归调用也是如此。处理递归时的唯一区别是first_func
和second_func
是相同的函数,但这并不影响返回的机制。
除了使用异常之类的方法外,无法立即退出整个调用链。