Помогите разобраться с кодом.

Валерий1960

Новичок
Пользователь
Июн 22, 2022
4
0
1
Ребят, помогите разобраться с кодом. Это код из книги Полякова К.Ю. - Программирование. Python. C++. Он переводит числа из десятичной системы счисления в двоичную. Вроде все понятно, но ничего не понятно. Прогнал код через дебагер, он ведет себя как - то странно. Ответ выдает верный, а как все получается непонятно. Такое ощущение что промежуточные данные записываются в стек а потом как - то по очереди извлекаются... Буду благодарен если кто - то разжует. Где - то я пропустил что - то глобальное. Спасибо за помощь.
Python:
def bin(n):
    if n == 0:return

    bin( n // 2 )

    print(n % 2, end="")

bin(6)
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
932
208
43
20
Москва
как число переводится в двоичную систему счисления: записываем остатки от деления на 2 в обратном порядке

ЧислоОстаток
60
31
11
6₁₀ = 110₂

Что делает код:
1655901812046.png
А в частном конкретном случае

1655902375238.png
 

Валерий1960

Новичок
Пользователь
Июн 22, 2022
4
0
1
Большое спасибо за отклик. У меня 2 главных затыка: 1. Где хранятся данные при первом прооходе (6, 3, 1)? 2. В моем понимании после n==0 по return должен быть произведен выход на print и дальше выход из программы, Но происходит совсем другое: прогграмма все время возвращается к return, вытаскивает из стека очередное число и возвращается к принту пока не закончатся все числа. Это свойство return, или как все это происходит? Извините за тупизну, но как говорится - "Народ хочет разобраться" ))).
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
после return никуда код не пойдёт, это конец веточки))
зачем тут нужен?
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
932
208
43
20
Москва
после return никуда код не пойдёт, это конец веточки))

зачем тут нужен?
Чтобы числа выводились не с новой строки, а то будет не
Код:
110
а
Код:
1
1
0
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
понятно............
 

Валерий1960

Новичок
Пользователь
Июн 22, 2022
4
0
1
Как же код дальше ретурна не пойдет? После него он три раза принтует. При этом он откуда - то достает числа (6, 3, 1) в обратной последовательности делит их на 2, берет остаток и выводит на принт, и так три раза. На дебагере прогонял, после первого прохода до n==0 все идет по плану, а после ретурна он прыгает на принт, потом опять возвращается, на вызов процедуры, потом опять на принт, и так три раза, после чего выходит из программы. При этом при первом проходе до n==0 n принимает значения по очереди (6 -3 - 1). При втором проходе (когда n == 0) n принимает значения в обратном порядке (1 - 3 - 6). Вопрос который не дает мне спать: где хранятся эти числа? Где - то образуется список или стек? Какой командой они извлекаются обратно?
 

Ципихович Эндрю

Активный пользователь
Пользователь
Мар 27, 2021
490
25
28
ТС, много текста, в который вникать неохота...
опробуйте, может так поймёте:
Код:
def bin(n):
    if n == 0:return
    print("ну, что зашло в ветку когда bin равен 0?")
    bin( n // 2 )
    print(n % 2, end="")
bin(0)
и ответьте себе на вопрос: ну, что зашло в ветку когда bin равен 0?
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
932
208
43
20
Москва
Стек вызовов функций
 

Валерий1960

Новичок
Пользователь
Июн 22, 2022
4
0
1
Ну наконец - то все объяснилось. Я так и знал, что должен быть стек иначе никак, осталось разобраться в деталях, но теперь понятно в каком направлении двигаться. Благодарю всех кто откликнулся на мою просьбу. Извините что сразу не отписался, тут на работу устроился, а после работы нет сил кнопку включения на ноутбуке нажать. А сегодня вот выходной, все - таки дополз до компа ))). Ребята всем читать материлал, это очень важно знать. Всем спасибо и удачи!
 

Форум IT Специалистов