python - 如何计算一个值在递归函数中出现的次数?

标签 python recursion combinatorics

如果您有递归函数(例如斐波那契数列):

def fib(n):
    """Return Fibonacci of n; assumes n is an int >= 0."""
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

例如,当调用 fib(20) 时,如何计算 fib(2) 发生的次数?

最佳答案

你可以使用装饰器:

import functools

def count(f):
    """Count function calls."""
    @functools.wraps(f)
    def counted(*args, **kwargs):
        counted.count_calls += 1
        return f(*args, **kwargs)
    counted.count_calls = 0
    return counted

fib = count(fib)
fib(5)
fib.count_calls
# 15

或者,您现在可以使用此装饰器和 @ 符号在任何函数定义之前添加:

@count
def fib(n):
    ...

fib(5)
fib.count_calls
# 15

注意,这个装饰器会累积函数调用:

fib(5)
fib(5)
fib.count_calls
# 30

这是一个巧妙的实现,利用了鲜为人知的 function attributes .请注意,原始装饰器是从 John DiNero 在他的 lecture on Memoization 中讨论的 count 函数修改而来的。他在其中解决了这个具体问题。

关于python - 如何计算一个值在递归函数中出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516688/

相关文章:

python - 如果数据框中的列名相同,则连接列

python - 中间包含 `\\\` 的 JSON 数据

java - [HELP]BST 递归插入时 Java StackOverflow 错误

python - 距离度量的组合优化

Python - 生成符合条件的大型集合组合的最有效方法?

c# - 生成所有可能的组合

Python 网络时间戳(SO_TIMESTAMP、SO_TIMESTAMPNS、SO_TIMESTAMPING)

python - Matplotlib B1-Motion(按住键的鼠标运动)等效?

python - 如何从递归函数返回单个 bool 值?

c# - 仁慈SSH.NET : How to delete nonempty directory?