Это мне не ясно, какие именно повторяющиеся значения, которые вы хотите считать это, так что я предполагаю, что это число раз функция (рекурсивный) была вызвана тем же аргументом (или группу из них, если их больше одного).
В приведенном ниже кодере декоратор с именем tally_recurring_args()
используется для обертывания функции в некотором коде для этого. Чтобы упростить ситуацию и избежать повторного использования колесика, collections.Counter
используется для подсчета количества вызовов каждой уникальной комбинации аргументов функции. Это делается атрибутом функции, поэтому на вызов в декодированную функцию можно легко ссылаться в wrapper
.
import collections
import functools
def tally_recurring_args(func):
func._args_counter = collections.Counter() @ add attribute to func
@functools.wraps(func)
def wrapper(*args):
key = ', '.join(str(arg) for arg in args)
func._args_counter[key] += 1
return func(*args)
return wrapper
@tally_recurring_args
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)
print('fib(5) -> {}'.format(fib(5)))
for args, count in sorted(fib._args_counter.items()):
print('fib({}): called {} time{}'.format(args, count,
's' if count > 1 else ''))
Выход:
fib(5) -> 8
fib(0): called 3 times
fib(1): called 5 times
fib(2): called 3 times
fib(3): called 2 times
fib(4): called 1 time
fib(5): called 1 time
можно реализовать счетчик TAHT вы передаете в качестве переменной в функции или изменить глобальную переменную, каждый раз, когда ... – deweyredman
кажется, я неправильно понял ваш вопрос ... i read recurs as recurses ... sorry – deweyredman
Вы хотите подсчитать количество вызовов 'fib (i)' для каждого 'i' при вычислении' fib (n) ', правильно? – DyZ