【问题标题】:Counting recursion in a python program! [duplicate]在 python 程序中计算递归! [复制]
【发布时间】:2011-07-23 09:52:32
【问题描述】:

我需要计算python程序中递归的次数。所以基本上我需要一个静态变量类型的东西(比如在 C 中),它可以计算函数被调用的次数。

【问题讨论】:

    标签: python recursion static


    【解决方案1】:

    一种方法是使用包含一个元素的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 代替变量有什么好处?
    【解决方案2】:

    只需通过递归传递一个计数器

    def recur(n, count=0):
        if n == 0:
            return "Finished count %s" % count
        return recur(n-1, count+1)
    

    或者我确定有一些花哨的装饰器,我现在要调查一下......

    【讨论】:

      【解决方案3】:
      >>> def func(n, count=0):
      ...     if n==0:
      ...             return count
      ...     else:
      ...             return func(n-1, count+1)
      ... 
      >>> func(100)
      100
      

      【讨论】:

        【解决方案4】:

        使用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
        >>> 
        

        【讨论】:

          【解决方案5】:

          您可以定义一个 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 而包装函数不知道它。
          • @Tom Zych 感谢您发现这一点!我现在已经修好了。
          • 哦,当然。隐藏函数名称。非常好。
          • 或者更确切地说,重新分配函数名称。
          猜你喜欢
          • 2023-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          • 2012-11-18
          • 2014-04-12
          • 1970-01-01
          相关资源
          最近更新 更多