Как понять вызывающую функцию в python-декораторах - PullRequest
0 голосов
/ 30 июня 2019

Я не могу понять, как найти число Фибоначчи с помощью процесса рекурсии. Код дается:

def timed(fn):

    from time import perf_counter
    from functools import wraps

    @wraps(fn)
    def inner(*args,**kwargs):
        start=perf_counter()
        result=fn(*args,**kwargs)
        end=perf_counter()
        elapsed=end-start

        print('{0}({1}) took {2:.6f}s to 
               run'.format(fn.__name__,args,elapsed))

        return result
    return inner

@timed
def calc_recursive(n):
    if n<=2:
        return 1
    else:
        return calc_recursive(n-1) + calc_recursive(n-2)

calc_recursive(4)

ниже выводится:

calc_recursive(2) took 0.000001s to run
calc_recursive(1) took 0.000001s to run
calc_recursive(3) took 0.000141s to run
calc_recursive(2) took 0.000001s to run
calc_recursive(4) took 0.000239s to run
3

Вот мое замешательство:Предположим, я нахожу calc_recursive (4). Так что это возвращаемое calc_recursive (3) + calc_recursive (2).И снова calc_recursive (3) рассчитывается как calc_recursive (2) (это возвращение 1) + calc_recursive (1) (это возвращение 1).Таким образом, calc_recursive (3) + calc_recursive (2) возвращает 2 + 1 = 3 и сохраняется в «результате». Но он снова выполняет всю «внутреннюю» функцию снова и снова без использования цикла. Почему они печатают снова снова, если не имеютЛюбой цикл внутри? Пожалуйста, объясните, как этот код работает?

...