【发布时间】:2011-07-23 09:52:32
【问题描述】:
我需要计算python程序中递归的次数。所以基本上我需要一个静态变量类型的东西(比如在 C 中),它可以计算函数被调用的次数。
【问题讨论】:
我需要计算python程序中递归的次数。所以基本上我需要一个静态变量类型的东西(比如在 C 中),它可以计算函数被调用的次数。
【问题讨论】:
一种方法是使用包含一个元素的list,该元素记录输入函数的次数。
>>> counter=[0]
>>> def recur(n):
... counter[0]+=1
... if n==0:
... return -1
... else:
... return recur(n-1)
...
>>> recur(100)
-1
>>> print counter[0]
101
【讨论】:
list 代替变量有什么好处?
只需通过递归传递一个计数器
def recur(n, count=0):
if n == 0:
return "Finished count %s" % count
return recur(n-1, count+1)
或者我确定有一些花哨的装饰器,我现在要调查一下......
【讨论】:
>>> def func(n, count=0):
... if n==0:
... return count
... else:
... return func(n-1, count+1)
...
>>> func(100)
100
【讨论】:
使用global的另一种方法:
>>> def recur(n):
... global counter
... counter+=1
... if n==0:
... return -1
... else:
... return recur(n-1)
...
>>> counter = 0
>>> recur(100)
-1
>>> print counter
101
>>>
【讨论】:
您可以定义一个 Counter 可调用类,用它可以包装任何函数:
class Counter(object) :
def __init__(self, fun) :
self._fun = fun
self.counter=0
def __call__(self,*args, **kwargs) :
self.counter += 1
return self._fun(*args, **kwargs)
def recur(n) :
print 'recur',n
if n>0 :
return recur(n-1)
return 0
recur = Counter(recur)
recur(5)
print '# of times recur has been called =', recur.counter
这里的优点是您可以将它用于任何功能,而无需修改它的签名。
编辑:感谢@Tom Zych 发现了一个错误。 recur 名称必须被可调用的类实例屏蔽才能工作。更多关于装饰器的信息:
http://wiki.python.org/moin/PythonDecoratorLibrary#Counting_function_calls
【讨论】:
1。不只是通过Counter 的第一个电话吗?我看不出有一种方法可以让递归调用通过 Counter 而包装函数不知道它。