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

2024-05-16 16:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在做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 = 10i = 1total = 1)。为什么会这样?如果达到基本条件,它肯定应该停止复发

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


Tags: 方法函数gtreturnifdef整数解决方案
1条回答
网友
1楼 · 发布于 2024-05-16 16:31:14

递归调用与任何其他函数调用一样:当它们返回时,它们将控制权返回给调用它们的任何函数

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

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是相同的函数,但这并不影响返回机制

没有办法(除了使用类似异常的东西)一次从整个调用链中退出

相关问题 更多 >