Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инфоматика лекция 1.docx
Скачиваний:
23
Добавлен:
17.11.2019
Размер:
48.31 Кб
Скачать

Задачи для самостоятельного решения

Задача 1.3.Придумайте алгоритм, вводящий три целых числа и определяющий, есть ли среди введенных чисел одинаковые или нет.

Задача 1.4.Придумайте алгоритм, вводящий три целых числа, который находит второе по величине число, если оно существует.

Задача 1.5.Придумайте алгоритм, вводящий три целых числа, определяющий количество максимальных чисел среди введенных.

Задача 1.6.Придумайте алгоритм, вводящий действительное число, который рассматривает это число, как координаты точки на прямой, и находит расстояние от этой точки до отрезка [0,1].

Задача 1.7.Придумайте алгоритм, находящий n -ое простое число.

Функциональное программирование

Для того чтобы представить себе стиль, в котором пишутся программы при использовании функциональных языков, рассмотрим несколько примеров программ на языке Haskell. Сначала разберем две программы, вычисляющие факториал  ! натурального числа   в соответствии с его различными определениями.

Первое определение   имеет вид  , а соответствующая ему программа не содержит ничего, кроме записи этого определения на языке Haskell:

f n = product [1..n]

Второе определение факториала расширяет область определения этой операции и является рекурсивным.

Программа, написанная в соответствии с ним, тоже является просто его переформулировкой:

f 0 = 1

f x = x * f (x-1)

В качестве значительно более сложного примера приведем текст программы, которая находит и печатает все варианты таких расстановок символов +, -,*,/ и круглых скобок в   -значном номере билета, что результатом вычислений будет число 100. Операция деления при этом допустима только в случае деления нацело, а количество   цифр в билете может быть произвольным. Программа решения этой задачи на языке Haskell является удивительно короткой:

Текст программы

tickets ds = (ds, foldl (\n c -> 10*n + digitToInt c) 0 ds) :

[("("++ld++[op]++rd++")", f lv rv) |

(op,f) <- [('+',(+)),('-',(-)),('*',(*)),('/',(div))],

n<-[1..length ds-1], (ld,lv) <- tickets (take n ds),

(rd,rv) <- tickets (drop n ds), op /= '/' || (rv /= 0

&& lv `mod` rv == 0)]

happy = map fst . (filter ((==)100 . snd)) . tickets

При использовании директивного или объектно-ориентированного подходов и таких языков, как C, C++ или Java, размер программы, решающей данную задачу, будет гарантированно намного большим. Справедливости ради надо отметить, что интерпретаторы функциональных языков обычно работают достаточно медленно.

Для запуска этой программы на компьютере, где установлен интерпретатор hugs языка Haskell, достаточно запустить его (набрав hugs ), а затем выполнить команды загрузки файла с программой ( :load ticket ) и запуска ее на выполнение. Последняя команда должна содержать в качестве параметра последовательность цифр билета в кавычках. Вот пример задания и полученного результата:

Main> (happy "234112")

["((2*(3+41))+12)","((2+3)*((41-1)/2))","(((2*3)+(4*11))*2)",

"(((2+3)*(41-1))/2)"]

Elapsed time (ms): 33150 (user), 20 (system)

Main>

Для выхода из интерпретатора hugs используйте команду :quit, а мы далее в этой книге не будем больше касаться проблем, связанных с функциональным или логическим программированием, — этому будут посвящены отдельные дисциплины на старших курсах обучения.