#python #algorithm #recursion #fibonacci
Вопрос:
# способ 1
def fib(a,b,c,i,x):
if i==x:
c = a b
print(c, "first print statement") # first print statement [21]
return c # c = 21, returns to the function itself
else:
c=a b
a=b
b =c
fib(a,b,c,i 1,x)
print(c,a,i) # recurssive prive statements [13,8,5,3,2,1]
return i
print(fib(0,1,1,0,6), "final print statement") # final print statement [0]
В 1-м методе, в блоке else, ниже функции рекурсии указана функция печати. И, следовательно, мы получаем ряд Фибоначчи, но в обратном порядке(от большого к малому).
def fib(a,b,c,i,x):
if i==x:
c = a b
print(a, "first print statement") # first print statement [21]
return c # c = 21, returns to the function itself
else:
print(a,i)
c=a b
a=b
b =c
fib(a,b,c,i 1,x)
# recurssive prive statements [13,8,5,3,2,1]
return i
print(fib(0,1,1,0,6),"last print statement") # final print statement [0]
Во 2-м методе мы получаем тот же паттерн Фибоначчи, но на этот раз в исходном порядке (от малого к большому).
единственное отличие в том, что инструкция print находится в самом начале блока else.
Как это возможно??
Как, изменяя положение инструкции печати, изменяется весь заказ?
мы знаем, что при рекурсии, когда стек опускается, значения извлекаются из памяти, и вывод выводится на печать. (от большего значения до наименьшего значения, присутствующего в глубине стека), поэтому порядок вывода на печать должен оставаться одинаковым для обоих условий, не так ли?
Пожалуйста, помогите мне узнать, как изменение положения инструкции печати в блоке else изменило порядок вывода.
Комментарии:
1. В первом случае вы выполняете рекурсию, а ЗАТЕМ печатаете (поэтому для достижения печати необходимо выполнить всю рекурсию), во втором вы печатаете, а ЗАТЕМ выполняете рекурсию (поэтому вы печатаете по мере продвижения).
2. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией для определения адекватного ответа.
Ответ №1:
Вы на правильном пути в своих рассуждениях, однако учтите, что с каждым рекурсивным вызовом, который вы выполняете в своем 1-м методе (печать после вызова fib), вы сначала будете проходить рекурсии, пока не достигнете условия выхода. это выведет «первый оператор печати», а затем выполнит печать после вызова fib с последним вычисленным значением. А затем мы поднимаемся по слоям рекурсии, тем самым печатая последовательность фибонаци в обратном порядке.
Способ видения состоит в том, чтобы представить коробки друг в друге. С помощью печати после вызова fib вы будете печатать от последнего до первого значения, а с помощью печати до того, как вы напечатаете от первого до последнего.
Вы можете попробовать эту небольшую программу, которая демонстрирует уровни рекурсии :
def recursive_function(level):
if level >= 5:
print('[ Level', level, ']-You reached the bottom of the call stack. Time to go back up in reverse')
else:
print('[ Level', level, ']-I get printed first and then you move down to level', level 1, 'of the call stack')
recursive_function(level 1)
print('[ Level', level, ']-I won't get printed unless you return from the level', level 1)
if __name__ == '__main__':
recursive_function(0)
какие отпечатки :
[ Level 0 ]-I get printed first and then you move down to level 1 of the call stack
[ Level 1 ]-I get printed first and then you move down to level 2 of the call stack
[ Level 2 ]-I get printed first and then you move down to level 3 of the call stack
[ Level 3 ]-I get printed first and then you move down to level 4 of the call stack
[ Level 4 ]-I get printed first and then you move down to level 5 of the call stack
[ Level 5 ]-You reached the bottom of the call stack. Time to go back up in reverse
[ Level 4 ]-I won't get printed unless you return from the level 5
[ Level 3 ]-I won't get printed unless you return from the level 4
[ Level 2 ]-I won't get printed unless you return from the level 3
[ Level 1 ]-I won't get printed unless you return from the level 2
[ Level 0 ]-I won't get printed unless you return from the level 1