1. Разбор задач Динамическое программирование Функции Задачи
Динамическое программирование
Информатика
10-11 классы
17 ноября 2011 г.
Информатика 10-11 классы
2. Разбор задач Динамическое программирование Функции Задачи
Разбор задач: средняя длина слова
Найдём среднюю длину слова в три этапа:
1 Вычислим количество слов в строке.
2 Найдём длину всей строки без пробелов (сумма длин
слов).
3 Поделим одно на другое.
Listing 1: Средняя длина слова
s = " T h i s i s a sample s t r i n g "
words = s . s p l i t ( " " )
s i z e = words . s i z e
res = 0.0
w o r d s . e a c h do | e l e m |
r e s = r e s + elem . s i z e
end
medium = r e s / s i z e
p u t s medium
Информатика 10-11 классы
3. Разбор задач Динамическое программирование Функции Задачи
Разбор задач: слова, длиннее следнего
Найдём среднюю длину строки в два этапа:
1 Посчитаем среднюю длину слова.
2 Найдём слова, чья длина больше средней.
... пропустим кусок, связанный с п.1.
Listing 2: Длиннее среднего
...
medium = r e s / s i z e
w o r d s . e a c h do | e l e m |
p u t s e l e m i f ( e l e m . s i z e > medium )
end
Информатика 10-11 классы
4. Разбор задач Динамическое программирование Функции Задачи
Динамическое программирование: принципы
Решая предыдущие задачи, мы столкнулись с тем, что:
1 Очень удобно разбивать задачу над несколько небольших
подзадач.
2 Зачастую, одна программа использует результаты,
полученные другой программой.
3 А в некоторых случаях подзадачи нескольких задач
совпадают.
Такой подход называется динамическим
программированием.
Динамическое программирование способ решения
сложных задач путём разбиения их на более простые
подзадачи (Википедия).
Информатика 10-11 классы
5. Разбор задач Динамическое программирование Функции Задачи
Инструменты
Для разбиения программы на подпрограммы в языках
программирования существует специальный инструмент,
называемый функциями.
В общем случае, функция это небольшая программа,
реализующая парадигму чёрного ящика.
Парадигма чёрного ящика предлагает разделение
сущности на составляющие. Каждая составляющая имеет
вход, сам, собственно, чёрный ящик и выход.
Чёрный ящик универсальная концепция, применимая не
только в программировании, но и в жизни.
Информатика 10-11 классы
6. Разбор задач Динамическое программирование Функции Задачи
Пример чёрного ящика
Рис.: Источник: http://g0l.ru/blog/imgs/gai/caricatura.jpg
Информатика 10-11 классы
7. Разбор задач Динамическое программирование Функции Задачи
Функции
Как уже было указано, простейшей реализацией чёрного
ящика является функция.
Функция подпрограмма внутри программы,
выполняющая некоторую функцию и имеющая входные
данные, тело (код) функции, выходные данные (что
функция возвращает)
Приведём простейший пример функции: перевод из
градусов Цельсия в градусы по Кельвину.
Listing 3: Цельсии в Кельвины
def c e l s i u s _ t o _ k e l v i n ( c e l s _ v a l u e )
kelv_value = cels_value + 273.15
return kelv_value
end
sample = c e l s i u s _ t o _ k e l v i n (20)
p u t s "20 by C e l s i u s = #{sample } by K e l v i n "
Информатика 10-11 классы
8. Разбор задач Динамическое программирование Функции Задачи
Функция в разрезе
def название_функции(аргументы)
В начале задания функции пишется ключевое слово def
(англ. definition определение).
Затем пишется название функции. Оно должно понятным
и на английском языке без пробелов и спецсимволов.
Далее, в скобках перечисляются входные данные, которые
называются аргументы функции.
Аргументы функции это несколько переменных, которые
нужны функции для её вычислений.
В конце функции пишется ключевое слово return (англ.
возврат). После return указывается, что возвращает
функция.
В самом конце ставится end.
В нашем случае функция возвращала значение
температуры в градусах по Кельвину.
Информатика 10-11 классы
9. Разбор задач Динамическое программирование Функции Задачи
Функции для чайников
Рис.: Источник: http://www.dialektika.com/
Информатика 10-11 классы
10. Разбор задач Динамическое программирование Функции Задачи
Ещё немного о функциях
Для вызова функции достаточно написать её имя, а затем
перечислить в скобках аргументы.
Например puts celsius_to_kelvin(20) выведет на экран
значение 20 градусов цельсия по шкале Кельвина.
Можно и через дополнительную переменную:
Listing 4: Функции
...
c e l s i u s _ v a l u e = 20
in_kelvin = celsius_to_kelvin ( celsius_value )
puts in_kelvin
Информатика 10-11 классы
11. Разбор задач Динамическое программирование Функции Задачи
И ещё чуть-чуть
Рис.: Источник: где-то в Интернетах
Информатика 10-11 классы
12. Разбор задач Динамическое программирование Функции Задачи
И ещё чуть-чуть
Важно! Все переменные внутри функции локальные. То
есть, если в программе есть переменная res, внутри
функции её НЕ БУДЕТ. И наоборот.
Такая программа вызовет ошибку, так как переменная
внутри функции не определена:
Listing 5: Ошибка с локальными переменными
elem = 5
def v e r y _ u s e f u l _ f u n c t i o n ( s o m e t h i n g )
p u t s elem
puts something
r e t u r n elem
end
Информатика 10-11 классы
13. Разбор задач Динамическое программирование Функции Задачи
Задача о палиндромоме
Палиндромом называют слово (или буквосочетание),
одинаково читающееся в обоих направлениях: топот, А
роза упала на лапу Азора (Фет).
Задача: вывести на экран все палиндромы–слова,
встречающиеся в строке.
Решим задачу методом динамического программирования:
1 Разделим предложение на слова.
2 Проверим каждое слово, является ли оно палиндромом
(функция).
3 Если является, то выведем его на экран.
Информатика 10-11 классы
14. Разбор задач Динамическое программирование Функции Задачи
Задача о палиндромоме
Listing 6: Задача о палиндроме
def palindrome ?( s )
i f ( s == s . r e v e r s e )
return true
else
return f a l s e
end
end
s = " I s a i d to madam a f t e r p a r t y : W W O "
words = s . s p l i t ( " " )
w o r d s . e a c h { | word | p u t s word i f p a l i n d r o m e ? ( word ) }
Информатика 10-11 классы
15. Разбор задач Динамическое программирование Функции Задачи
Числа Фибоначчи
Выведем на экран первые N чисел Фибоначчи.
Listing 7: Числа Фибоначчи
def f i b o n a c c i ( n )
a0 = 1
a1 = 1
a_new = 0
for i in 2 . . n
a_new = a0 + a1
a0 = a1
a1 = a_new
end
r e t u r n a1
end
n = 5
for i in 0 . . n
p u t s "#{ i } число Фибоначчи = #{f i b o n a c c i ( i )} "
end
Информатика 10-11 классы
16. Разбор задач Динамическое программирование Функции Задачи
References
Все презентации доступны на http://school.smirik.ru!
Вопросы, предложения, д/з: smirik@gmail.com
Информатика 10-11 классы