如何计算函数返回特定值的次数?

2024-09-30 00:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数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 )

Tags: 函数returnifdefcounterreturningthreeprint
2条回答

您的函数从不返回"Computing fib( 3 )",它只打印。这就是为什么你的条件recFib(n) == "Computing fib( 3 )"永远不会实现的原因。修改代码的最简单方法是:

counter = 0

def recFib(n):
    global counter
    print("Computing fib" "(",n,")" )
    if n==3:
        counter += 1
    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(counter)

这确实产出了21

使用call counter decorator

装饰师

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

只需将decorator添加到原始代码中

@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

相关问题 更多 >

    热门问题