Почему, изменяя положение оператора печати, в шаблоне Фибоначчи, в рекурсии, изменяется порядок вывода?

#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