Условные операторы и рекурсия
Условные операторы
- Выполнение или невыполнение команд в зависимости от свойств данных
- Пустые и непустые объекты
Логические операции (сравнения, in, is, …), True и False
- Простейший условный оператор
Полный вид if else
Ещё более полный вид if / elif / ... / else
Вложенные if
TODO
Логические выражения
- Булева алгебра: «И», «ИЛИ», «НЕ»
- Таблицы истинности
- Классическая булева алгебра:
or
and
A
B
A or B
A
B
A and B
False
False
False
False
False
False
False
True
True
False
True
False
True
False
True
True
False
False
True
True
True
True
True
True
- Python3: понятие пустого и непустого объекта
or
and
A
B
A or B
A
B
A and B
Пусто
Пусто
B (пусто)
Пусто
Пусто
A (пусто)
Пусто
Непусто
B (непусто)
Пусто
Непусто
A (пусто)
Непусто
Пусто
A (непусто)
Непусто
Пусто
B (пусто)
Непусто
Непусто
A (непусто)
Непусто
Непусто
B (непусто)
- OR: если A истинно, результат истинен, вычислять B не надо
- ⇒ Python: если A истинно, результат равен A, иначе B
- AND: если A ложно, результат ложен, вычислять B не надо
- ⇒ Python: если A ложно, результат равен A, иначе B
⇒ частичное вычисление выражений A и B: 3+4 or 10/0
- Классическая булева алгебра:
Вложенный if и «И»
Рекурсивный вызов функции
- Бесконечный рекурсивный вызов (бесконечность очень маленькая)
Останов рекурсии: логическое выражение над изменяемыми данными
- Примитивная рекурсия (счётчик)
- Общая рекурсия (произвольное условие)
примеры (TODO распилить и снабдить пояснениями)
1 from turtle import * 2 3 def triangle(size): 4 pd() 5 fd(size) 6 lt(120) 7 fd(size) 8 lt(120) 9 fd(size) 10 lt(120) 11 pu() 12 13 def some_triangles(size, n): 14 triangle(size) 15 if n: 16 some_triangles(size/2, n-1) 17 18 def shifted_triangles(size, n): 19 triangle(size) 20 if n: 21 lt(30) 22 fd(size/4) 23 rt(30) 24 shifted_triangles(size, n-1) 25 lt(30) 26 bk(size/4) 27 rt(30) 28 29 def unpredictable_triangles(size, minsize): 30 triangle(size) 31 if size>minsize: 32 lt(30) 33 fd(size/6) 34 rt(30) 35 unpredictable_triangles(size/1.5, minsize) 36 lt(30) 37 bk(size/6) 38 rt(30) 39 40 def swirl_triangles(size, minsize): 41 triangle(size) 42 if size>minsize: 43 lt(10) 44 fd(size/6) 45 #rt(30) 46 swirl_triangles(size/1.5, minsize) 47 #lt(30) 48 bk(size/6) 49 rt(10) 50 51 def swirl_numbers(size, n): 52 write(str(n)) 53 if n: 54 lt(30) 55 fd(size+n*size/10) 56 swirl_numbers(size, n-1) 57 bk(size+n*size/10) 58 rt(30) 59 60 pd() 61 speed(10) 62 triangle(66) 63 color("green") 64 goto(-150,-150) 65 some_triangles(150, 3) 66 color("blue") 67 goto(150, 150) 68 shifted_triangles(120, 4) 69 color("magenta") 70 goto(-150, 150) 71 unpredictable_triangles(150, 8) 72 color("red") 73 goto(150, -150) 74 swirl_triangles(150, 8) 75 color("ForestGreen") 76 goto(-200,0) 77 swirl_numbers(15,10) 78 79 mainloop()
Д/З
Прочитать и прощёлкать пятую главу учебника
- Написать программу, которая будет получать на вход число, и если оно больше ста, выводить количество сотен, если меньше — количество единиц (напр. ввод: 12345, вывод: 3; ввод: 45, вывод: 5).
- Написать программу, которая будет получать на вход три числа и проверять, существует ли треугольник с такими сторонами (не забыть проверить все варианты).
- лучше это сделать, задав и вызвав три функции (пригодятся для рисования домика).
- Написать программу, которая будет получать на вход число от одного до трёх и, если введено 1, рисовать круг, если 2 — квадрат, если 3 — треугольник. Если введено иное — выводить сообщение, что такую фигуру черепашка рисовать пока не умеет.
- Написать функцию, которая рисует домик.
- Написать рекурсивную функцию, которая рисует улицу (много домиков разного размера).