【问题标题】:Recursion accumulation or how to count number of recursion calls in Python? [duplicate]递归累积或如何计算 Python 中的递归调用次数? [复制]
【发布时间】:2018-12-23 14:32:16
【问题描述】:

我已经阅读了很多 Python 手册,但无法弄清楚这一点。

调用自身的函数中有两个局部变量,其中只有一个的行为类似于“静态”。

这里是sn-p的代码:

def sort_bubble(local_itera, difficulty):   
    #local_itera = itera[:]
    sorted_count = 0
    nrecursions = 0

    for i in range(difficulty - 1):
        val1 = local_itera[i]
        val2 = local_itera[i+1]

        if local_itera[i] == min(val1, val2):
            sorted_count += 1
            continue # skip sorted pairs
        else: # swap
            local_itera[i] = min(val1, val2)
            local_itera[i+1] = max(val1, val2)

    if not sorted_count == difficulty - 1: # recurse if not sorted
        nrecursions += 1
        sort_bubble(local_itera, difficulty)

虽然sorted_count 会增加,但nrecursions 不会增加,我想用它来计算递归调用的次数。

请注意,这样做的目的是为了 作为一个独立的函数(这只是原型):

  • 全局变量无法达到目的
  • 类语法开销无法达到目的

附录

我正在考虑以下方向。

(取自 Python 手册)

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

但这也太过分了。

【问题讨论】:

  • 修复代码中的缩进并解释问题到底出在哪里以及您指的是哪个变量
  • nrecursions 应该只在递归函数外初始化一次,并在递归函数内简单地递增。顺便说一句,NO 变量表现为静态,sorted_countnrecursions 都在函数体内一直被初始化,并获取一些不会被调用保留的值
  • 因为它获得了一些值(在单个递归调用期间),基于if .. 测试停止递归。没有魔法很简单。在任何情况下,它都不会从 cal 中保留其值,因为每次调用函数时都会重新初始化它。这很清楚
  • 我链接到@AgnesK.Cathex 的副本还有其他选项。例如,您可以简单地创建一个可调用对象的类。这是自包含的,但为您提供局部静态变量。
  • 不,@AgnesK.Cathex。可调用,因为能够将类实例用作函数。不过,您也许可以让 yield 为您工作。

标签: python algorithm recursion static


【解决方案1】:

问题似乎在于,与sorted_count 不同,您不会在任何地方增加对您的函数的调用次数。要计算递归次数,您需要适当地递增它。 [操作说明:问题已更新]

此外,您的nrecursions 将在每次函数调用期间重新初始化为 0,因为您已将其置于函数内部。所以你应该在函数外将它初始化为0。

在我看来,这是增加它的正确位置,如下所示。另外,你需要将你的变量设为global

nrecursions = 0

def sort_bubble(local_itera, difficulty):   
    global nrecursions
    # Function body

    if not sorted_count == difficulty - 1: # recurse if not sorted
        nrecursions += 1 # <--- added here
        sort_bubble(local_itera, difficulty)

【讨论】:

  • 问题解决了sorted_count也在正文中初始化的事实。
  • @AgnesK.Cathex:您不应该在函数内部初始化递归变量。想想看,一旦你再次调用它,变量就会被设置为零,所以你永远不会得到任何增量
  • @ChristianDean:我认为只要在函数内使用nrecursions的更新值就可以了。仅当退出函数后使用 if 时,才需要全局定义,否则函数外始终为 0。对吗?
  • @ChristianDean:完成
  • @ChristianDean:完成
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多