(495) 240-82-80ПН-СБ с 10:00 до 18:00
We speak English

Урок 3.1. Гипотеза Коллатца

В рамках данного урока вы более детально изучите программирование с использованием условий, а также создадите программу, в которой вам предстоит поработать с недоказанной гипотезой.

Вы научитесь:

  • Использовать операторы отношений и логические операторы
  • Использовать операторы для работы с целыми числами (% и //)
  • Писать программы с применением выражений типа IF и циклов с проверкой условия WHILE

Мы каждый день сталкиваемся с выбором. Вся наша жизнь - это череда принятых решений. Мы постоянно задаем себе вопросы: "Ты голоден?", "Что на ужин?", "Тебе холодно?", "Что же надеть?", "Мы уже приехали?" и так далее. Такой процесс принятия решений в программировании неразрывно связан с использованием выражений типа if и циклов с проверкой условия while, и оба этих оператора зависят от условий программы. Пример использования операторов if и while показан на рисунке.

Условие - это выражение, результатом которого является значение Верно или Неверно (True или False):

X > Y       A+B <= C        Qty > 0       5 != 3

Выше представлены такие условия ("!=" - знак неравенства).

Условие может содержать один или несколько следующих операторов отношений:

==       >        <        !=       >=       <=

Составные условия состоят из логических операторов, таких как:

and               or               not

Условия прописываются в работе со структурами типа if и циклами с проверкой условия while.

Внимание: При работе с условием не забывайте использовать двойной знак равенства ==, а не одиночный =. Применение неверного знака приведет к синтаксической ошибке. Следует писать if x==5:, а не if x=5:. С такими тонкостями поможет разобраться меню ctrl+=.

В данном уроке вы поработаете с этими важными инструментами программирования.

Примечание для учителя: Учащегося может запутать использование двойного знака == для обозначения равенства и оператора != для обозначения условия "не равняется". В данном уроке вы узнаете о применении двух новых арифметических операторов в программировании на языке Python - % и //.
a % b отображает остаток целого числа при делении a на b.
a // b отображает целое от частного при делении a на b, что соответствует функции int(a/b).

1. Гипотеза Коллатца

Алгоритм: Берем любое натуральное число: если оно четное, поделим его на 2, если оно нечетное - умножим на 3 и прибавим 1. Над полученным числом выполняем те же действия. Что произойдет с последовательностью?

Для начала создайте новый файл Python (в примере мы назвали его Collatz).

Присвойте переменной num целое число, используя следующее выражение:

num = int( input( "Enter a positive integer: "))

Выражение int( можно найти через меню: menu > Built-ins > Type.

Выражение input( можно также найти через меню: menu > Built-ins > I/O.

2. Оператор условия if бывает трех видов: if.., if..else.. и if..elif..else... Все эти выражения можно найти в меню: menu > Built-ins > Control. Обратите внимание на то, что оператора then (то) в языке Python нет.

(Данные операторы находятся в пункте Control, потому что они контролируют процесс выполнения программы.)

If.. Используется при отсутствии действия otherwise (в противном случае).

if..else.. Используется, когда применяются два альтернативных действия, Верно и Неверно (True и False). (Чуть позже мы покажем это в примере)

if..elif..else.. Используется, когда необходимо применить три (и более) операции в зависимости от нескольких условий. Оператор elif является сокращением выражения else if... и требует применения условия пита if. При выполнении алгоритма вы можете использовать оператор elif столько раз, сколько потребуется. (Пример с данным оператором вы увидите в Практикуме Урока 3.)

Примечание для учителя: Обратите внимание на двоеточие (:) в конце операторов if, elif и else. Оно необходимо для обозначения того, что последующая информация - это действия, которые необходимо выполнить, когда условие является Верным или Неверным (True или False). Выражение BooleanExpr и каждый соответствующий ему структурированный "блок" будут заменены на необходимые действия.
Оператор else: не требует условия.
else: и elif: также доступны как "независимые" операторы в данном меню, но их нужно использовать вместе с оператором if...

Выражения True и False (Верно и Неверно) пишутся с заглавной буквы и являются ключевыми словами в программировании на языке Python. Чтобы создать бесконечный цикл, можно воспользоваться функцией while True:. Чтобы остановить программу, которая "застряла" в бесконечном цикле, нажмите следующие клавиши:
Калькулятор: ON          Windows: [F12] или Fn+[F12]          Mac: [F5]

3. Вставьте оператор if..else с помощью меню: menu > Built-ins > Control.

Нажмите tab или стрелку вправо, чтобы перемещаться от подсказки к подсказке.

Примечание для учителя: Если вы вводите выражение вручную, то подсказки в виде фразы BooleanExpr или block не будет. Нажмите tab, чтобы перемещаться от подсказки к подсказке.

4. Условием для BooleanExpr является следующее выражение:

if num % 2 == 0:

Знак % это математический оператор (как +, - * и /) и он называется "оператором деления по модулю" (mod). Он показывает остаток при делении одного числа на другое. Слово mod является сокращением от "modulus" (модуль).

Знак % можно найти в кнопках пунктуации рядом с буквой G.

Если остаток при делении на 2 равен нолю, то число является четным.

Обратите внимание на то, что используются два знака равенства!

Чтобы ввести двойной знак равенства ==, нажмите = два раза. Все операторы отношений можно найти в меню ctrl+=.

Примечание для учителя: Обратите внимание на то, что в языке Python нет выражения then (то). В нем нет необходимости!

5. Для оператора if: (когда число четное)

блок (верхний) будет следующим:

num = num // 2

Знак // (двойной знак деления) является целым делением (в ответе не будет никаких десятичных чисел или отбрасывания, только целое число). Если вы используете одиночный знак деления /, в ответе вы увидите десятичную запятую, даже если результат будет целым числом. Запомните, что использовать нужно двойной знак деления / (кнопка ÷).

6. Для оператора else: (когда число нечетное)

блок представлен в следующем виде:

num = 3 * num + 1

7. После блока оператора if..else: вернитесь к началу строки, сотрите символы структурирования и запишите выражение print:

print(num)

8. Пришло время запустить программу:

Для этого нажмите ctrl+R. Введите натуральное число. Появится ответ.

Снова нажмите ctrl+R, но на этот раз введите последний ответ.

Запускайте программу повторно, каждый раз вводя предыдущий результат вычисления.

Далее вы должны добавить в программу цикл, чтобы весь указанный выше процесс выполнялся автоматически без вашего участия, и вам не приходилось запускать программу снова и снова...

Примечание для учителя: Что при этом происходит? Со временем число будет равно 1, и снова повторится цикл 1,4,2,1,4,2,1...

9. Поместите курсор под выражение input и над оператором if, как показано на рисунке. (Строку <<< cursor here в программе писать не нужно, фраза дана в примере для наглядности).

10. В этой пустой строке добавьте выражение while, которое можно найти через меню: menu > Built-ins > Control.

Вы увидите следующее:

while BooleanExpr:

block

Эти данные будут вставлены в вашу программу.

Примечание для учителя: Вы видите здесь структурированный Блок (block), но фактически блок уже находится в программе в виде структуры if и выражения print. Следующий шаг показывает, как структурировать всю область текста.

11.Сотрите всю строку, которая называется "блок" (block). Выберите всю структуру if и выражение print, используя комбинацию клавиш shift+стрелка вниз. Нажмите tab, чтобы структурировать все эти строки, то есть проставить перед ними пробелы, чтобы система увидела, что все эти данные являются блоком оператора while.

Примечание для учителя: Еще один способ структурирования помимо нажатия на tab - это следующий пункт меню: menu > Edit > Indent. Пункт Dedent - это обратная функция структурирования, и ее можно вызвать с помощью комбинации клавиш shift+tab.

12. Теперь напишите условие путем замены выражения BooleanExpression.

Гипотеза Коллатца гласит, что в любой последовательности чисел результатом рано или поздно будет 1.

Но пока число больше 1, нужно продолжать вычисления. Запишите это условие:

while num > 1 :

Не забудьте поставить двоеточие (:) в конце этой строки.

13. Запустите программу. Введите число 20. Следуя логике программы, нечетные числа увеличиваются, а четные - уменьшаются.

20 - четное → 10

10 - четное → 5

5 - нечетное → 16

16 - четное → 8

И так далее...

... программа закончит работу, когда значение будет равно 1.

Обратите внимание на то, что для создания цикла вам потребовалось написать всего одну строку кода!

Можно ли подобрать такое число, чтобы программа НИКОГДА не закончила вычисление? Попробуйте ввести большое число. Обратите внимание на то, как быстро отображаются результаты вычисления при запуске программы. По окончании работы цикла вы можете пролистать вверх и посмотреть историю приложения Shell и проанализировать числа.

Примечание для учителя: История приложения Shell - это обычный текст, и даже когда вы сохраняете документ TI-Nspire, после его закрытия история будет удалена. Если вам необходимо сохранить некоторые фрагменты истории приложения Shell, выделите нужную часть, скопируйте ее и вставьте в приложение Заметки (Notes).
Чтобы очистить историю приложения Shell, используйте следующие пункты меню: menu > Tools > Clear History.
Также существует программная команда удаления истории приложения Shell (она похожа на функцию "очистить отображаемое на экране").
Гипотеза Коллатца, представленная в 1937 году, до сих пор является не доказанной. Что можно сказать о таких числах как 3, 1 и 2 в данном алгоритме? Попробуйте использовать разные числа для вычисления.
В данную программу можно при желании добавить еще одно действие. Например, посчитать количество шагов вычисления до того момента, когда результат будет равен 1.