Найти - Пользователи
Полная версия: Помощь с ханойскими башнями
Начало » Python для новичков » Помощь с ханойскими башнями
1 2 3
m1r42
Ktulich
что то я смотрю на ваш пример и только больше путаюсь
Держи, дружище, программа веселей если с шутками.
 n = 3
start = 2
finish = 1
def move(n, start, finish, check):
    print("запустился move c параметрами",n,start,finish)
    if n == 1:
        print("печатаем че надо этому программисту")
        print("задолбался я уже считать эту головоломку")
        print("лучше бы в Heroes III поиграли")
        print(n, start, finish,"         ",check)
        print("данный move закончил свой жизненный цикл","\n")
    else:
        print("первый параметр n не равен 1 ща расчитаем tmp и запихуем в finish")
        print("да еще и от n отнимем 1 чтобы было веселей")
        tmp = 6 - start - finish
        print("n = ",n-1)
        print("start = ",start)        
        print("finish = ",tmp)
        check += 1
        move(n - 1, start, tmp , check)
        print(",а это твой следующий результат, подавись")
        print("и посмотри где move запустился с такими параметрами")
        print(n, start, finish,"         ",check)
        print("что не смешно? то,то! А мне думаешь весело считать эту чупуху?")
        check += 1
        print("теперь от n отнимем 1, чтобы тебе голову сломать")
        print("и в старт впихуем tmp которая, так, между прочим равна",tmp)
        print("n = ",n - 1)
        print("start = ",tmp)
        print("finish = ",finish)
        move(n - 1, tmp, finish, check)
        
check = 1        
move(n, start, finish, check)
Еще вариант:
 n = 3
start = 2
finish = 1
def move(n, start, finish, check):
    print("запустился move c параметрами",n,start,finish)
    print("номер запуска move на всякий случай чтобы ты голову не сломал ",check)
    print("у нас же все таки рекурсия, кто сказал, что будет легко")
    if n == 1:
        print("печатаем че надо этому программисту")
        print("задолбался я уже считать эту головоломку")
        print("лучше бы в Heroes III поиграли")
        print(n, start, finish)
        print("данный move закончил свой жизненный цикл","\n")
    else:
        print("первый параметр n не равен 1 ща расчитаем tmp и запихуем в finish")
        print("да еще и от n отнимем 1 чтобы было веселей")
        tmp = 6 - start - finish
        print("n = ",n-1)
        print("start = ",start)        
        print("finish = ",tmp)
        check += 1
        move(n - 1, start, tmp , check)
        print(",а это твой следующий результат, подавись")
        print("я его вывожу по принту, который ты в else записал")
        print("и посмотри где move запустился с такими параметрами")
        print(n, start, finish)
        print("что не смешно? то,то! А мне думаешь весело считать эту чупуху?")
        check += 1
        print("теперь от n отнимем 1, чтобы тебе голову сломать")
        print("и в старт впихуем tmp которая, так, между прочим равна",tmp)
        print("и снова запустим move, так как mova то два в условии else")
        print("это и будет второй теперь работать, рекурсия же опять")
        print("n = ",n - 1)
        print("start = ",tmp)
        print("finish = ",finish)
        move(n - 1, tmp, finish, check)
        
check = 1        
move(n, start, finish, check)
Ktulich
Спасибо за нетоксичный ответ.
Но стало еще сложнее, пытаюсь теперь из объяснения удалить лишние шутки и оставить обьяснение, чтобы начать разбираться
m1r42
Держи, дружище, программа веселей если с шутками. А вообще забавная головоломка, мне понравилась.
m1r42
Ktulich
Но стало еще сложнее, пытаюсь теперь из объяснения удалить лишние шутки и оставить обьяснение, чтобы начать разбиратьс
Да, там счет не работает, вот код с рабочим счетом запусков
 n = 3
start = 1
finish = 3
def move(n, start, finish):
    global check
    check += 1
    print("запустился move c параметрами",n,start,finish)
    print("номер запуска move на всякий случай чтобы ты голову не сломал ",check)
    print("у нас же все таки рекурсия, кто сказал, что будет легко")
    if n == 1:
        print("печатаем че надо этому программисту")
        print("задолбался я уже считать эту головоломку")
        print("лучше бы в Heroes III поиграли")
        print(n, start, finish)
        print("данный move закончил свой жизненный цикл","\n")
    else:
        print("первый параметр n не равен 1 ща расчитаем tmp и запихуем в finish")
        print("да еще и от n отнимем 1 чтобы было веселей")
        tmp = 6 - start - finish
        print("n = ",n-1)
        print("start = ",start)        
        print("finish = ",tmp)
        move(n - 1, start, tmp)
        print(",а это твой следующий результат, подавись")
        print("я его вывожу по принту, который ты в else записал")
        print("и посмотри где move запустился с такими параметрами")
        print(n, start, finish)
        print("что не смешно? то,то! А мне думаешь весело считать эту чупуху?")
        print("теперь от n отнимем 1, чтобы тебе голову сломать")
        print("и в старт впихуем tmp которая, так, между прочим равна",tmp)
        print("и снова запустим move, так как mova то два в условии else")
        print("это и будет второй теперь работать, рекурсия же опять")
        print("n = ",n - 1)
        print("start = ",tmp)
        print("finish = ",finish)
        move(n - 1, tmp, finish)
        
check = 0        
move(n, start, finish)
Посмотри в ответе, где заканчивается работа move() только по условию if если if не выполняется, то else запускает первый move() потом этот в свою очередь проверяет условие if и если опять работает else то все повторяется пока move не умрет по if, а когда заканчивает жизнь первый вложенный move то выполняется print в else, но там еще один move который запускает все заново, но с другими условиями и тд до выхода по if
xam1816
Ktulich
4.
move(n - 1, start, tmp)
—->
move(2, 1, 2)
Но в принт это не ушло, это просто запомнила программа
5.
print(n, start, finish)

твоя ошибка в том что ты думаешь что 5 - это вывод информации, а он не наступит, потому что четвертым ты вызвал функцию move с новыми аргументами, курсор интерперетатора перешел в начало этой функции
ZerG
Установи пишарм
Запусти код в дебаггере
Там будет окошко показывать переменные все
выполняя пошагово код ты будешь видеть с какой строки на какую переходишь и чт в этот момент происходит со значениями переменных
Наглядней не придумали еще ничего
Ktulich
ZerG
Установи пишарм Запусти код в дебаггереТам будет окошко показывать переменные всевыполняя пошагово код ты будешь видеть с какой строки на какую переходишь и чт в этот момент происходит со значениями переменныхНаглядней не придумали еще ничего
именно в пайчарме я и работаю
и нет, дебаггер не помог для наглядности, переменные там меняются но наглядно непонятно почему
код m1r42 помогает понемногу вникнуть, вот пока вникаю
m1r42
Ktulich
вот пока вникаю
Вот еще вариант. Меняй в этом коде n руками 2,3,4,5,6… до тех пор пока пайтон не пошлет тебя из за огромной рекурсии, шутка, хватит до 5
Не обращай на цифры start и stop они пока нафиг не нужны их будет рассчитывать программа сама в
соответствии с алгоритмом.
И наблюдай за результатом. И, возможно, но это не точно, ты увидишь как в результатах появляется некая закономерность. Столбик цифар будет расти и расти из центра вверх и вних и будут еще какие-то разветвления от цифар в знаках больше меньше. Ведь n это волшебная переменная, как и результат в центре столбца. Сначала ты увидишь 1 результат в скобках потом 3,7,15,31 и т.д. пока комп не сломается.
2**2 - 1, 2**3 -1, 2**4 - 1, и т.д. степени числа где первая двойка - это количество вложенных процедур move(), а минус 1 это потому, что … сам догадайся
Если и это не поможет, то на этом мои полномочия все

 def move(n, start, finish):
    if n == 1:
        print(" ",n, start, finish," ")
    else:
        tmp = 6 - start - finish
        move(n - 1, start, tmp)
        print("<",n, start, finish,">")
        move(n - 1, tmp, finish)
       
move(2, 1, 1)
Забыл сказать, что цифра 6 в формуле расчета tmp не влияет на рост или уменьшения числа рекурсий.
xam1816
Ktulich
и нет, дебаггер не помог для наглядности, переменные там меняются но наглядно непонятно почему

как вам такое Илон Маск
  
move(3, 1, 3)
def move(n, start, finish): # n=3, start=1, finish=3
    if n == 1:# False
        print(n, start, finish)# пропускаем
    else:
        tmp = 6 - start - finish # 6 - 1 - 3 = 2
        move(n - 1, start, tmp) # выполняем move(3-1, 1, 2) = move(2, 1, 2) точка возврата 1
        print(n, start, finish)# дальше не выплнится пока не закончит работу выше вызванная функция
        move(n - 1, tmp, finish)# -//-//-//
#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish): # n=2, start=1, finish=2 | move(2, 1, 2)
    if n == 1:# False
        print(n, start, finish)# пропускаем
    else:
        tmp = 6 - start - finish # 6 - 1 - 2 = 3
        move(n - 1, start, tmp) # выполняем move(2-1, 1, 2) = move(1, 1, 3) точка возврата 2
        print(n, start, finish)# дальше не выплнится пока не закончит работу выше вызванная функция
        move(n - 1, tmp, finish)# -//-//-//
#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish): # n=1, start=1, finish=3 
    if n == 1:# True
        print(n, start, finish)# выводим на экран 1,1,3
    else:  # дальше не выполняется
        tmp = 6 - start - finish 
        move(n - 1, start, tmp) 
        print(n, start, finish) 
        move(n - 1, tmp, finish)
    # функция закончила работу курсор возвращается к точке возврата 2 для удобства написал ее снова ниже
#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish): # n=2, start=1, finish=2 | move(2, 1, 2)
    if n == 1:# False
        print(n, start, finish)# пропускаем
    else:
        tmp = 6 - start - finish # 6 - 1 - 2 = 3
        move(n - 1, start, tmp) # выполняем move(2-1, 1, 2) = move(1, 1, 3) точка возврата 2>функция move(1,1,3) закончилась 
        print(n, start, finish)# выводим на экран n=2, start=1, finish=2 = 2,1,2
        move(n - 1, tmp, finish)# выполняем move(2-1, 3, 2) = move(1, 3, 2) точка возврата 3
#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish): # n=1, start=3, finish=2 | move(1, 3, 2)
    if n == 1:# True
        print(n, start, finish)# выводим на экран 1, 3, 2
    else: # дальше не выполняем
        tmp = 6 - start - finish 
        move(n - 1, start, tmp) 
        print(n, start, finish)
        move(n - 1, tmp, finish)
    # функция закончила работу курсор возвращается к точке возврата 3 для удобства написал ее снова ниже
#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish): # n=2, start=1, finish=2 | move(2, 1, 2)
    if n == 1:# False
        print(n, start, finish)# пропускаем
    else:
        tmp = 6 - start - finish # 6 - 1 - 2 = 3
        move(n - 1, start, tmp) # выполняем move(2-1, 1, 2) = move(1, 1, 3) точка возврата 2>функция move(1,1,3) закончилась 
        print(n, start, finish)# выводим на экран n=2, start=1, finish=2 = 2,1,2
        move(n - 1, tmp, finish)# выполняем move(2-1, 3, 2) = move(1, 3, 2) точка возврата 3 функция move(1,3,2) закончилась
    # функция закончила работу курсор возвращается к точке возврата 1 для удобства написал ее снова ниже
# VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def move(n, start, finish): # n=3, start=1, finish=3
    if n == 1:# False
        print(n, start, finish)# пропускаем
    else:
        tmp = 6 - start - finish # 6 - 1 - 3 = 2
        move(n - 1, start, tmp) # выполняем move(3-1, 1, 2) = move(2, 1, 2) точка возврата 1> move(2,1,2) закончилась
        print(n, start, finish)# выводим на экран 3, 1, 3
        move(n - 1, tmp, finish)#  выполняем move(2, 2, 3)
m1r42
xam1816
как вам такое Илон Маск
к черту компьютер, мы руками умеем
Не , тема забавная, я уже целый час как с работы не могу уйти.
                (1) результат           1
/
(2) - выводит саму себя 2
/ \
/ (1) рузультат 3
/
(3) выводит саму себя 4
\
\ (1) результат 5
\ /
(2) выводит саму себя 6
\
(1) результат 7
Думаю это художество все разъяснит раз и навсегда. Надо валить с работы.
Ktulich
xam1816
твоя ошибка в том что ты думаешь что 5 - это вывод информации, а он не наступит, потому что четвертым ты вызвал функцию move с новыми аргументами, курсор интерперетатора перешел в начало этой функции
а как мы дальше то идем?
вот что я сейчас не понимаю, как, доведя до n == 1, рекурсия не останавливается
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB