解决 Python 中的 Kempner 函数 - 为什么这个并发函数在达到基本情况后继续?

Solving the Kempner Function in Python - why is this concurrent function continuing after the base case is reached?

我一直在做 Python 个谜题,我一直在做的一个是使用并发函数来解决 Python 中的 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 ) 并返回 return max(1, i-1) 然后 else 子句中的所有内容将继续 运行 直到函数 returns 达到其起始条件(例如对于 kempner(10) 然后 n = 10i = 1total = 1)。为什么要这样做?达到基本条件就应该停止复发了吧?

这是一个比较抽象的问题,显然是我的知识盲点。如果有人有任何见解,我将不胜感激。

递归调用就像任何其他函数调用一样:当它们 return 时,它们 return 控制回任何调用它们的东西。

假设您有一系列编号的递归调用:

1 -> 2 -> 3 -> 4
               Base Case Reached

如果递归调用 3 调用递归调用 4,并且递归调用 4 在基本情况下结束,return从递归调用 4 将带您回到递归调用 3,因为 3 调用了 4。这是就像任何其他函数调用一样:

def second_func():
    print("Inner")
    return 5

def first_func():
    return second_func()

当您从 second_func return 时,您 return 控制权回到 first_func,因为 first_func 调用了 second_func。您不会立即退出 second_func 回到 main 或其他。递归调用也是如此。处理递归时的唯一区别是 first_funcsecond_func 是相同的函数,但这并不影响 returning.

的机制

没有办法(除了使用异常之类的东西)立即退出整个调用链。