Решение: Подсчёт рекурсивных вызовов
Ниже приведены две рекурсивные функции F и G. Функция G печатает символ «звёздочка» и при выполнении условия вызывает функцию F. Сколько символов «звёздочка» будет напечатано на экране при выполнении вызова F(14)?
1def F(n): 2 if n > 0: 3 G(n - 3) 4 5def G(n): 6 print("*") 7 if n > 1: 8 F(n - 1)
Решение по шагам
4 шагаВызов F(14) удовлетворяет условию $n > 0$, поэтому выполняется вызов G(11).
$$F(14) \to G(11)$$Функция G(11) печатает одну «звёздочку» и вызывает F(10), так как $11 > 1$.
$$G(11) \to F(10)$$Аналогично продолжается цепочка рекурсивных вызовов.
$$F(10) \to G(7) \to F(6) \to G(3) \to F(2) \to G(-1)$$Функция G была вызвана для аргументов $11$, $7$, $3$ и $-1$. Каждый такой вызов печатает один символ, а после G(-1) рекурсия прекращается.
$$1 + 1 + 1 + 1 = 4$$Где здесь ошибаются
Не учитывать печать символа при вызове G(-1): условие проверяется только после команды print.
Остановить рекурсию при отрицательном аргументе G, хотя функция G всё равно успевает напечатать символ.
Посчитать вызовы F вместо вызовов G.