Рекурсия
В каждой функции можно вызвать другую функцию.
Например, в функции
carreLine(size, n)
вызывается функция
carre(size)
.
В рекурсивной функции вызывается САМА эта функция, но с ДРУГИМИ переменными.
Пример.
Функция рисует черточки (for)
|
Рекурсивная функция рисует черточки
|
#!/local-home/student/Downloads/or/bin/python3
from turtleru import *
import math
краска=["красный", "зеленый", "синий",
"желтый", "рыжий","коричневый", "фиолетовый"]
def dashW(size, n):
размерПера(6)
for i in range(n):
цвет(краска[(n - 1)-i])
пиши(i)
пероВниз()
вперед(size)
пероВверх()
вперед(size)
начало()
dashW(50,7)
конец()
|
#!/local-home/student/Downloads/or/bin/python3
from turtleru import *
import math
краска=["красный", "зеленый", "синий",
"желтый", "рыжий","коричневый", "фиолетовый"]
def dashR(size, n):
размерПера(6)
цвет(краска[n-1])
пиши(n)
# проверяем n
# если n > 0, можно рисовать
if n > 0:
пероВниз()
вперед(size)
пероВверх()
вперед(size)
# вызываем функцию dashR с
# с новым числом (n-1)
dashR(size, n-1)
начало()
dashR(50,7)
конец()
|
|
|
Задача Квадраты.
Самый маленький квадрат (
размер
) рисуем первым. Все остальные квадраты больше на
20
.
Написать РЕКУРСИВНУЮ функцию
def carreR(размер)
, которая рисует такую картинку. Писать с
while
.
Функция рисует квадрат если его
размер
<
300
Задача Круги
Самый большой круг (
размер
) рисуем первым. Все остальные круги больше на
20
.
Написать функцию
def circleR(размер)
, которая рисует такую картинку. Писать с
while
.
Функция рисует круг если
размер
>
0
Наибольший общий делитель (РЕКУРСИЯ)
from turtleru import *
import math
# Функция ищет наибольший отрезок (линию)
# для двух других
# Алгоритм Евклида
краска=["красный", "зеленый", "синий", "рыжий","коричневый", "желтый","фиолетовый"]
def evR(size1,size2,n):
if size1 % size2 == 0:
return size2
размерПера(5)
цвет(краска[n])
пероВниз()
пиши(size1)
# нарисуем две линии:
пероВниз()
цвет(краска[n%7])
вперед(size1)
цвет(краска[(n + 1)%7])
пиши(size2)
пероВниз()
вперед(size2)
# подвинем черепаху вниз
назад(size2)
право(90)
пероВверх()
вперед(30)
лево(90)
# вернем размер линии
nod = evR(size2, size1 % size2,n+1)
return nod
начало()
пероВверх()
встатьНа(-400,0)
nod=evR(228,336,0)
пиши (nod)
конец()
Задача Наибольший общий делитель для квадратов
Написать РЕКУРСИВНУЮ функцию
NOD(size1, size2)
, которая ищет самый большой квадрат, из которого можно СОСТАВИТЬ квадрат
size1
и квдарт
size2
.
Нарисовать все квадраты в центре.
Снежинка
Напишем рекурсивную программу для рисования луча снежинки:
from turtleru import *
import math
краска=["синий", "фиолетовый" ,"желтый", "красный","зеленый", "рыжий","коричневый" ]
def luchV(size,r,n,w):
цвет(краска[0])
размерПера(3)
пероВниз()
# черепаха всегда должна быть в начале луча
вперед(size)
назад(size)
# если глубина 0, больше ничего не рисуем
# возвращаемся
if n==0:
return
# если глубина не 0
# будем рисовать дальше
# подвинем черепаху по лучу либо на size*2/3, либо на size/3
вперед(size*r/3)
# нарисуем еще три ветки (луча)
лево(60)
# рекурсивный вызов рисования самого левого луча
luchV(size/3,r,n-1,краска[n%3])
# рекурсивный вызов рисования самого правого луча
право(120)
luchV(size/3,r,n-1,краска[n%3])
# рекурсивный вызов рисования центрального луча
лево(60)
luchV(size/3,r,n-1,краска[n%3])
# встали на место
назад(size*r/3)
начало()
luchV(240,2,2,"синий")
конец()
Снежинка1
Написать функцию
sn(size, n)
, которая из лучей рисует снежинку глубиной
n
Можно нарисовать другой луч
from turtleru import *
import math
краска=["синий", "фиолетовый" ,"желтый", "красный","зеленый", "рыжий","коричневый" ]
def luchV(size,r,n,w):
цвет(краска[0])
размерПера(3)
пероВниз()
# черепаха всегда должна быть в начале луча
вперед(size)
назад(size)
# если глубина 0, больше ничего не рисуем
# возвращаемся
if n==0:
return
# если глубина не 0
# будем рисовать дальше
# подвинем черепаху по лучу либо на size*2/3, либо на size/3
вперед(size*r/3)
# нарисуем еще три ветки (луча)
лево(60)
# рекурсивный вызов рисования самого левого луча
luchV(size/3,r,n-1,краска[n%3])
# рекурсивный вызов рисования самого правого луча
право(120)
luchV(size/3,r,n-1,краска[n%3])
# рекурсивный вызов рисования центрального луча
лево(60)
luchV(size/3,r,n-1,краска[n%3])
# встали на место
назад(size*r/3)
# луч "усиски вниз"
def luchN(size,r,n,w):
цвет(w)
размерПера(3)
тт=где()
пероВниз()
вперед(size)
назад(size)
if n==0:
return
вперед(size*r/3)
право(240)
luchN(size/3,r,n-1,краска[n%3])
лево(120)
luchN(size/3,r,n-1,краска[n%3])
право(60)
luchN(size/3,r,n-1,краска[n%3])
вперед(size*r/3)
лево(180)
начало()
luchN(240,2,3,"синий")
конец()
Задача Снежинка2
Написать функцию, которая рисует луч с веками вверх и вниз
Снег
Нарисовать разные снежинки
--
TatyanaOvsyannikova2011 - 13 Jun 2017