Форум сайта python.su
Ktulichкогда дошло до n == 1, вывелись на экран аргументы, функция закончила работу, курсор вернулся обратно в функцию move(2, 1, 2) после функции move(1, 1, 3), там идет print(n, start, finish) - вывелось 2, 1, 2
ак, доведя до n == 1, рекурсия не останавливается
Офлайн
xam1816а почему он сразу не выводит 2, 1, 2, а ждет, пока выведет 1, 1, 3 ?
когда дошло до n == 1, вывелись на экран аргументы, функция закончила работу, курсор вернулся обратно в функцию move(2, 1, 2) после функции move(1, 1, 3), там идет print(n, start, finish) - вывелось 2, 1, 2
Офлайн
Ktulichпотому что когда вызывается функция, он все бросает и выполняет эту функцию
а почему он сразу не выводит 2, 1, 2, а ждет, пока выведет 1, 1, 3 ?
Офлайн
xam1816дописал 3 последних принта, правильно?
как вам такое Илон Маск
def move(n, start, finish): # n=1, start=2, finish=1 if n == 1: # True print(n, start, finish) # print 1, 2, 1 else: tmp = 6 - start - finish # сюда не идет move(n - 1, start, tmp) print(n, start, finish) move(n - 1, tmp, finish) # функция закончила работу курсор возвращается к точке возврата 4 для удобства написал ее снова ниже # VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV def move(n, start, finish): # n=2, start=2, finish=3 if n == 1: # False print(n, start, finish) # пропускаем else: tmp = 6 - start - finish # 6 - 2 - 3 = 1 move(n - 1, start, tmp) # выполняем move(2-1, 2, 1) = move(1, 2, 1) точка возврата 4> move(1,2,1) закончилась print(n, start, finish) # print 2, 2, 3 move(n - 1, tmp, finish) # выполняем move(1, 1, 3) # VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV def move(n, start, finish): # n=1, start=1, finish=3 if n == 1: # True print(n, start, finish) # print 1, 1, 3 else: tmp = 6 - start - finish # сюда не идет move(n - 1, start, tmp) print(n, start, finish) move(n - 1, tmp, finish)
Офлайн
Ktulichда как-то так
дописал 3 последних принта, правильно?
Офлайн
xam1816
да как-то так
Офлайн
KtulichТебе надо с рекурсией разбираться. И возьми для этого какую-нибудь функцию попроще. Если ты считаешь, что n не меняется, это значит, что ты не понимаешь, как рекурсивная функция работает и копирует саму себя в точно такие же экземпляры. Там получается лестница из абсолютно одинаковых функций. Всё это надо представлять при работе с рекурсиями. Тогда ты будешь знать, что n в одной копии функции и n в другой копии функции - это разные n'ки, и таких разных n'ок могут быть тысячи.
не понимаю, почему принт выдает разные результаты, хотя n не меняет значение.
Отредактировано py.user.next (Ноя. 11, 2022 00:25:39)
Офлайн
Вот еще вариант для наглядности. Подписал параметры для наглядности, на самом деле это тоже результат. Рост количества запусков процедуры внутри процедуры растет по формуле 2**0+2**1+2**n-1 …
spase = " " def move(n,start,finish): if n == 1: print(spase*(m-1),"move(",n,start,finish,") --- результат") else: tmp = 6 - start - finish move(n-1,start,tmp) print(spase*(m-n),"move(",n,start,finish,") --- параметры") move(n-1,tmp,finish) n = 3 m = n move(n,1,3)
move( 1 1 3 ) --- результат
move( 2 2 3 ) --- параметры
move( 1 2 1 ) --- результат
move( 3 1 3 ) --- параметры
move( 1 3 2 ) --- результат
move( 2 1 2 ) --- параметры
move( 1 1 3 ) --- результат
Отредактировано m1r42 (Ноя. 11, 2022 09:53:03)
Офлайн