在Python中解决Kempner函数-在达到基本情况后,为什么此并发函数仍继续存在? 例如:

问题描述

我一直在做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_funcsecond_func是相同的函数,但这并不影响返回的机制。

除了使用异常之类的方法外,无法立即退出整个调用链。