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

Обсуждение тем, связанных с учебным процессом, и не только

Модератор: Преподаватели

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

Сообщение Telnov » 05 сен 2011, 06:21

Непроцедурные языки программирования (НеЯП) существуют давно.
С точки зрения принципов получения решений НеЯП делятся на:
    - реляционные (SQL, QBE, HQL, …);
    - функциональные (Haskell, Lisp, ML, Scheme, Рефал, Erlang, Scala, …);
    - логические (Prolog, Snobol, Oz, Mercury, Agda, …).
НеЯП принято относить к языкам программирования сверхвысокого уровня.

ScreenHunter_08 Sep. 05 07.20.gif
ScreenHunter_08 Sep. 05 07.20.gif [ 83.65 KiB | Просмотров: 5960 ]
ScreenHunter_09 Sep. 05 07.21.gif
ScreenHunter_09 Sep. 05 07.21.gif [ 123.77 KiB | Просмотров: 5959 ]


Вместе с тем, почти весь серьезный софт сегодня создается с использованием ООП.
Возникает вопрос. НеЯП - это такие занятные игрушки или это перспективные технологии? Предлагаю вашему вниманию публикацию одного из недавних магистрантов нашей кафедры - Haskell: с чего начать?
В.Тельнов
Аватар пользователя
Telnov
Преподаватель
 
Сообщений: 303
Изображения: 5
Зарегистрирован: 05 сен 2011, 00:19
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.

Фракталы

Сообщение Telnov » 05 сен 2011, 06:29

Слово фрактал образовано от латинского fractus и в переводе означает "состоящий из фрагментов".
Термин предложен Бенуа Мандельбротом в 1975 году для обозначения нерегулярных, но самоподобных структур. Рождение фрактальной геометрии принято связывать с выходом его книги The Fractal Geometry of Nature.

Алгебраические фракталы получают с помощью нелинейных процессов в n-мерных пространствах. Наиболее изучены двухмерные процессы. Фрактальные множества на комплексной плоскости строятся так:
Точка z0 принадлежит множеству, если итерационная последовательность z=f(z) не расходится при начальном значении z=z0, где z - комплексное число, а f(z) - комплексная функция комплексного переменного.

Для лучшей визуализации границы фрактальных множеств прорисовываются наиболее детально. Цвет и яркость каждой точки на границе фрактального множества соответствуют количеству итераций, после которых последовательность комплексных чисел z начинает расходиться (т.е. модуль комплексного числа z превышает некоторую, заранее установленную константу).

Итерационная формула для множества Мандельброта выглядит так: z = z*z + c, где z и c - комплексные числа.
Само множество Мандельброта образуют те точки с, для которых итерационная последовательность не расходится (т.е. модуль комплексного числа z ограничен некоторой константой на любой итерации).
Если рассмотреть множество точек не с, а z0, для которых та же последовательность не расходится, то они образуют так называемые фракталы Жулиа. Их много, они выглядят весьма интересно, и при некоторых значениях c превращаются в пыль Фату. Здесь есть достаточно полный обзор.

Множество Мандельброта.gif
Множество Мандельброта.gif [ 21.56 KiB | Просмотров: 5959 ]
Кот Мандельброт.jpg
Кот Мандельброт.jpg [ 21.3 KiB | Просмотров: 5808 ]
В.Тельнов
Аватар пользователя
Telnov
Преподаватель
 
Сообщений: 303
Изображения: 5
Зарегистрирован: 05 сен 2011, 00:19
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.

Программирование множества Мандельброта

Сообщение Telnov » 05 сен 2011, 06:33

Простейший код на F# для построения множества Мандельброта и отображения его в окне Windows:
Код: выделить все
open System                                // Множество Мандельброта - простейший код
open System.Numerics
open System.Windows.Forms
open System.Drawing
let rec nrpt f x = function           // рекурсивная функция для проверки сходимости
   | 0 -> x                                   // последовательности комплексных чисел
   | n -> nrpt f (f x) (n - 1)
let mandelf c z = z * z + c          // собственно последовательность комплексных чисел
let ismandel c = Complex.Abs (nrpt (mandelf c) Complex.Zero 30) < 2.0            // сходится?
let colmandel = function true -> Color.BlueViolet | _ -> Color.AntiqueWhite     // выбор цвета для отрисовки
let scale (x,y) (u,v) n = float(n - u) / float(v - u) * (y - x) + x                            // масштабирование
let form =
   let image = new Bitmap(600, 600)                                                     // битовая карта для отрисовки
   let lscale = scale (-1.2, 1.2) (0, image.Height-1)                                           // масштабируем
   let rec filler = function                                                                                // и рисуем ...
   | -1 , _ -> ()
   | y , -1 -> filler (y - 1, (image.Width - 1))
   | y , x  -> let t = Complex(lscale y, lscale x)
               image.SetPixel ( y, x, t |> ismandel |> colmandel )                 // конвейер
               filler (y, x - 1)
   filler (image.Height - 1, image.Width - 1)
   let temp = new Form(Width = 600, Height = 600)                               // сделаем окошко ...
   temp.Paint.Add(fun e -> e.Graphics.DrawImage (image, 0, 0))           // битовую карту - в окошко
   temp                                                                                               // всё вычислим ...
do Application.Run(form)                                                                    // старт приложения
В.Тельнов
Аватар пользователя
Telnov
Преподаватель
 
Сообщений: 303
Изображения: 5
Зарегистрирован: 05 сен 2011, 00:19
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.


Вернуться в Вопросы программирования

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1