【发布时间】: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_count和nrecursions都在函数体内一直被初始化,并获取一些不会被调用保留的值 -
因为它获得了一些值(在单个递归调用期间),基于
if ..测试停止递归。没有魔法很简单。在任何情况下,它都不会从 cal 中保留其值,因为每次调用函数时都会重新初始化它。这很清楚 -
我链接到@AgnesK.Cathex 的副本还有其他选项。例如,您可以简单地创建一个可调用对象的类。这是自包含的,但为您提供局部静态变量。
-
不,@AgnesK.Cathex。可调用,因为能够将类实例用作函数。不过,您也许可以让
yield为您工作。
标签: python algorithm recursion static