首页 > 解决方案 > 您如何计算函数返回特定值的次数?

问题描述

我有一个函数 def recFib 它返回一堆不同的数字,但我希望能够计算它返回“计算 fib(3)”的次数。我试图实现一个计数器,但它只返回 0。有人知道我会怎么做吗?

代码:

# fib.py
def loopFib(n):
    # pre: n > 0
    # returns the nth Fibonacci number
    curr = 1
    prev = 1
    for i in range(n-2):
        curr, prev = curr+prev, curr
    return curr

def recFib(n):
    print("Computing fib" "(",n,")" )

    if n<3:
        print("Leaving fib" "(",n,")" "returning",1)
        return 1
    else:
        x=recFib(n-1)
        y=recFib(n-2)
        print("Leaving fib" "(",n,")" "returning",x+y)
        return x+y



n = 10
#print(recFib(n))



counter = []
if (recFib(n) == "Computing fib( 3 )"):
    counter.append('Three')

count3s = counter.count('Three')
print("Threes", count3s )

#Should return 21 instances of "Computing fib(3)"

输出:(输出的示例)

Computing fib( 10 )
Computing fib( 9 )
Computing fib( 8 )
Computing fib( 7 )
Computing fib( 6 )
Computing fib( 5 )
Computing fib( 4 )
Computing fib( 3 )
Computing fib( 2 )
Leaving fib( 2 )returning 1
Computing fib( 1 )
Leaving fib( 1 )returning 1
Leaving fib( 3 )returning 2
Computing fib( 2 )
Leaving fib( 2 )returning 1
Leaving fib( 4 )returning 3
Computing fib( 3 )

标签: python

解决方案


使用呼叫计数器装饰器

装饰者

def call_counter(func):
    def helper(x):
        if x == 3:
          # Counts calls when argument is 3
          helper.calls += 1
        return func(x)
    helper.calls = 0
    return helper

只需在原始代码中添加装饰器

@call_counter   # Add decorator
def recFib(n):
    print("Computing fib" "(",n,")" )

    if n<3:
        print("Leaving fib" "(",n,")" "returning",1)
        return 1
    else:
        x=recFib(n-1)
        y=recFib(n-2)
        print("Leaving fib" "(",n,")" "returning",x+y)
        return x+y

用法

print(recFib(10))
print(f'Instances of computing fib 3 is {recFib.calls}')

输出

Instances of computing fib 3 is 21

推荐阅读