解决 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 = 10
、i = 1
、total = 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_func
和 second_func
是相同的函数,但这并不影响 returning.
的机制
没有办法(除了使用异常之类的东西)立即退出整个调用链。
我一直在做 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 = 10
、i = 1
、total = 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_func
和 second_func
是相同的函数,但这并不影响 returning.
没有办法(除了使用异常之类的东西)立即退出整个调用链。