Динамическое программирование на ruby
DESCRIPTION
Основы динамического программирования на языTRANSCRIPT
Разбор задач Динамическое программирование Функции Задачи
Динамическое программирование
Информатика10-11 классы
17 ноября 2011 г.
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Разбор задач: средняя длина слова
Найдём среднюю длину слова в три этапа:1 Вычислим количество слов в строке.2 Найдём длину всей строки без пробелов (сумма длин
слов).3 Поделим одно на другое.
Listing 1: Средняя длина слова
s = "This␣ 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 er e s = 0 .0words . each do | e lem |
r e s = r e s + elem . s i z eendmedium = r e s / s i z eput s medium
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Разбор задач: слова, длиннее следнего
Найдём среднюю длину строки в два этапа:1 Посчитаем среднюю длину слова.2 Найдём слова, чья длина больше средней.
... пропустим кусок, связанный с п.1.
Listing 2: Длиннее среднего
. . .medium = r e s / s i z ewords . each do | e lem |
put s elem i f ( elem . s i z e > medium)end
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Динамическое программирование: принципы
Решая предыдущие задачи, мы столкнулись с тем, что:1 Очень удобно разбивать задачу над несколько небольших
подзадач.2 Зачастую, одна программа использует результаты,
полученные другой программой.3 А в некоторых случаях подзадачи нескольких задач
совпадают.
Такой подход называется динамическимпрограммированием.Динамическое программирование — способ решениясложных задач путём разбиения их на более простыеподзадачи (Википедия).
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Инструменты
Для разбиения программы на подпрограммы в языкахпрограммирования существует специальный инструмент,называемый функциями.В общем случае, функция — это небольшая программа,реализующая парадигму чёрного ящика.Парадигма чёрного ящика предлагает разделениесущности на составляющие. Каждая составляющая имеетвход, сам, собственно, чёрный ящик и выход.Чёрный ящик — универсальная концепция, применимая нетолько в программировании, но и в жизни.
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Пример чёрного ящика
Рис.: Источник: http://g0l.ru/blog/imgs/gai/caricatura.jpg
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Функции
Как уже было указано, простейшей реализацией чёрногоящика является функция.Функция — подпрограмма внутри программы,выполняющая некоторую функцию и имеющая входныеданные, тело (код) функции, выходные данные (чтофункция возвращает)Приведём простейший пример функции: перевод изградусов Цельсия в градусы по Кельвину.
Listing 3: Цельсии в Кельвины
def c e l s i u s_ t o_k e l v i n ( c e l s_va l u e )ke l v_va lue = ce l s_va l u e + 273.15re tu rn ke l v_va lue
end
sample = c e l s i u s_ t o_k e l v i n (20)put s "20␣by␣Ce l s i u s ␣=␣#{sample}␣by␣Kelv in "
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Функция в разрезе
def название_функции(аргументы)В начале задания функции пишется ключевое слово def(англ. definition — определение).Затем пишется название функции. Оно должно понятными на английском языке без пробелов и спецсимволов.Далее, в скобках перечисляются входные данные, которыеназываются аргументы функции.Аргументы функции — это несколько переменных, которыенужны функции для её вычислений.В конце функции пишется ключевое слово return (англ.возврат). После return указывается, что возвращаетфункция.В самом конце ставится end.В нашем случае функция возвращала значениетемпературы в градусах по Кельвину.
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Функции для чайников
Рис.: Источник: http://www.dialektika.com/
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Ещё немного о функциях
Для вызова функции достаточно написать её имя, а затемперечислить в скобках аргументы.Например puts celsius_to_kelvin(20) выведет на экранзначение 20 градусов цельсия по шкале Кельвина.Можно и через дополнительную переменную:
Listing 4: Функции
. . .c e l s i u s_ v a l u e = 20i n_ke l v i n = c e l s i u s_ t o_k e l v i n ( c e l s i u s_ v a l u e )put s i n_ke l v i n
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
И ещё чуть-чуть
Рис.: Источник: где-то в Интернетах
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
И ещё чуть-чуть
Важно! Все переменные внутри функции локальные. Тоесть, если в программе есть переменная res, внутрифункции её НЕ БУДЕТ. И наоборот.Такая программа вызовет ошибку, так как переменнаявнутри функции не определена:
Listing 5: Ошибка с локальными переменными
elem = 5def v e r y_us e f u l_ fun c t i o n ( someth ing )
put s elemput s someth ingreturn elem
end
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Задача о палиндромоме
Палиндромом называют слово (или буквосочетание),одинаково читающееся в обоих направлениях: топот, Ароза упала на лапу Азора (Фет).Задача: вывести на экран все палиндромы–слова,встречающиеся в строке.Решим задачу методом динамического программирования:
1 Разделим предложение на слова.2 Проверим каждое слово, является ли оно палиндромом
(функция).3 Если является, то выведем его на экран.
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Задача о палиндромоме
Listing 6: Задача о палиндроме
def pa l i nd rome ?( s )i f ( s == s . r e v e r s e )
re tu rn t ruee l s e
re tu rn f a l s eend
end
s = " I ␣ sa i d ␣to␣madam␣ a f t e r ␣party : ␣WOW"words = s . s p l i t ("␣" )words . each { | word | put s word i f pa l i nd rome ?( word ) }
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
Числа Фибоначчи
Выведем на экран первые N чисел Фибоначчи.
Listing 7: Числа Фибоначчи
def f i b o n a c c i ( n )a0 = 1a1 = 1a_new = 0f o r i i n 2 . . n
a_new = a0 + a1a0 = a1a1 = a_new
endretu rn a1
endn = 5f o r i i n 0 . . n
put s "#{i }␣число␣Фибоначчи␣=␣#{f i b ona c c i ( i )}"end
Информатика 10-11 классы
Разбор задач Динамическое программирование Функции Задачи
References
Все презентации доступны на http://school.smirik.ru!Вопросы, предложения, д/з: [email protected]
Информатика 10-11 классы