Что делать, если не понятна логика работы кода (что происходит "под капотом")?
Объясните, пожалуйста, логику кода. Мне не понятно то, что происходит "под капотом":
def F(n):
if n > 2:
return F(n-1)+ G(n-2)
else: return 1
def G(n):
if n > 2:
return G(n-1) + F(n-2)
else: return 1
print(F(7))
Если возможно, распишите пожалуйста поэтапно.
Ответы (3 шт):
Добавьте отладочную информацию - так станет немного понятнее:
def F(n):
if n > 2:
print(f"F({n}): calling F({n-1}) + G({n-2})")
return F(n-1)+ G(n-2)
else:
print(f"G({n}): return 1")
return 1
def G(n):
if n > 2:
print(f"G({n}): calling G({n-1}) + F({n-2})")
return G(n-1) + F(n-2)
else:
print(f"G({n}): return 1")
return 1
print(F(7))
Вывод:
F(7): calling F(6) + G(5)
F(6): calling F(5) + G(4)
F(5): calling F(4) + G(3)
F(4): calling F(3) + G(2)
F(3): calling F(2) + G(1)
G(2): return 1
G(1): return 1
G(2): return 1
G(3): calling G(2) + F(1)
G(2): return 1
G(1): return 1
G(4): calling G(3) + F(2)
G(3): calling G(2) + F(1)
G(2): return 1
G(1): return 1
G(2): return 1
G(5): calling G(4) + F(3)
G(4): calling G(3) + F(2)
G(3): calling G(2) + F(1)
G(2): return 1
G(1): return 1
G(2): return 1
F(3): calling F(2) + G(1)
G(2): return 1
G(1): return 1
13
А что тут объяснять? Берёте и смотрите, что происходит в функции F если её вызвать с аргументом n = 7. Какие она при этом вызовет функции и с какими аргументами. И т.д. В конце-концов придёте к вызовам функций F и G с аргументом n = 1, при этом сработает return 1, эта единица вернётся в места вызова F(1) и G(1), в этом месте тоже что-то посчитается и вернётся и т.д. пока не дойдёте обратно до вызова F(7) и узнаете, что там вернулось. Просто берёте ручку и всё расписываете - и всё станет понятно.
если n==2 или n==1 обе функции возвращают 1. В противном случае они возвращают сумму значений возвращаемых еще двумя функциями (здесь это те же функции, но с аргументом уменьшенным на 1 и 2 соответственно).
то есть имеем такую последовательность вызовов:
f7 = f6+g5
= (f5+g4) + (g4+f3)
= ((f4+g3) + (g3+f2)) + ((g3+f2) + (f2+g1))
= (((f3+g2) + (g2+f1)) + ((g2+f1) + (1))) + (((g2+f1) + (1)) + ((1) + (1)))
= ((((f2+g1) + (1)) + ((1) + (1))) + (((1) + (1)) +(1)))) + ((((1) + (1)) + (1))) + ((1) + (1))))
= (((((1) + (1)) + (1)) + ((1) + (1))) + (((1) + (1)) +(1)))) + ((((1) + (1)) + (1))) + ((1) + (1))))
= 13