Сделать домашней|Добавить в избранное
 

Сайт, посвящен программированию,
исходникам разных программ и
известным алгоритмам

 
Исходники программ » Языки программирования » Haskell » Лабораторная работа № 2 (Haskell)
ivi.ru [CPS]
на правах рекламы

Лабораторная работа № 2 (Haskell)

Автор: admin от 3-01-2012, 19:29

Цель работы: научится определять рекурсивные функции. Получить представление о механизме сопоставления с образцом. Приобрести навыки определения функций для обработки списков. на функциональном языке программирования haskell

Задание 1
   Определите функцию, принимающую на вход целое n и возвращающую список, содержащий n элементов, упорядоченных по возрастанию.

  1. Список натуральных чисел.
  2. Список нечётных натуральных чисел.
  3. Список чётных натуральных чисел.
  4. Список квадратов натуральных чисел.
  5. Список факториалов
  6. Список степеней двойки
  7. Список треугольных чисел*
  8. Список пирамидальных чисел#.
* n-е треугольное число tn равно количеству одинаковых монет, из которых можно построить равносторонний треугольник, на каждой стороне которого укладывается n монет. Нетрудно убедится, что t1=1 и tn=n+tn-1
# n-е пирамидальное число pn равно количеству одинаковых шаров, из которых можно построить пирамиду с треугольным основанием, на каждой стороне которой укладывается n шаров. Нетрудно убедится, что p1=1 и pn=tn+pn-1)
Решение:
1)
list2 :: Integer -> [Integer]
list2 0 = [ ]
list2 x = list2 (x-1)++(x:[])

list1 :: Integer -> [Integer]
list1 0 = [ ]
list1 x = list1 (x-1)++(2*x-1:[])

list3 :: Integer -> [Integer]
list3 0 = [ ]
list3 x = list3 (x-1)++(2*x:[])

list4 :: Integer -> [Integer]
list4 0 = [ ]
list4 x = list4 (x-1)++(x*x:[])

list5 :: Integer -> [Integer]
factorial 0 = 1
factorial x = x*factorial(x-1)
list5 0 = [ ]
list5 x = list5 (x-1)++[factorial(x)]  

list6 :: Integer -> [Integer]
stepen 1 = 1
stepen x = 2*stepen(x-1)
list6 0 = [ ]
list6 x = list6 (x-1)++[stepen(x+1)]

list7 :: Integer -> [Integer]
piram 1 = 1
piram(x) = x+piram(x-1)
list7 0 = [ ]
list7 x = list7 (x-1)++[piram(x)]

list8 :: Integer -> [Integer]
pir 1 = 1
pir(x) = x+pir(x-1)
p 1 = 1
p x = pir(x) + p(x-1)
list8 0 = [ ]
list8 x = list8 (x-1)++[p(x)]


Результаты:
1)
Main> :load "c:\\haskell\\laba21.hs"
Reading file "c:\haskell\laba21.hs":

Hugs session for:
C:\Haskell\lib\Prelude.hs
c:\haskell\laba21.hs
Main> list2 5
[1,2,3,4,5] :: [Integer]

2)
Main> list1 5
[1,3,5,7,9] :: [Integer]

3)
Main> list3 8  
Reading file "c:\haskell\Laba21.hs":
[2,4,6,8,10,12,14,16] :: [Integer]

4)
Main> list4 8
Reading file "c:\haskell\Laba21.hs":
[1,4,9,16,25,36,49,64] :: [Integer]  

5)
Main> list5 5
[1,2,6,24,120] :: [Integer]  

6)
Main> list6 7
[2,4,8,16,32,64,128] :: [Integer]

7)
Main> list7 4
Reading file "c:\haskell\Laba21.hs":
[1,3,6,10] :: [Integer]

8)
Main> list8 4
[1,4,10,20] :: [Integer]


Задание 2
  Определите следующие функции:
   2.1) Функция removeOdd, которая удаляет из заданного списка целых чисел все нечётные числа. Например removeOdd [1,4,5,6,10] должен возвращать [4,10].
   2.2) Функция substitute :: Char -> Char -> String -> String, которая заменяет в строке указанный символ на заданный. Пример: substitute ‘e’ ‘i’ “eigenvalue” возвращает “iiginvalui”.
Решение:

2.1)
removeOdd :: [Integer] -> [Integer]
removeOdd [] = []
removeOdd (x:xs) = if odd x then removeOdd xs else x : removeOdd xs

2.2)
substitute :: Char -> Char -> String -> String
substitute a b [] = []
substitute a b (h:t) = if h == a then b : substitute a b t else h :   substitute a b t

Результаты:
2.1)
Main> :load "c:\\haskell\\laba22.hs"
Reading file "c:\haskell\laba22.hs":

Hugs session for:
C:\Haskell\lib\Prelude.hs
c:\haskell\laba22.hs
Main> removeOdd [1,2,5,3,8,9,5]
[2,8] :: [Integer]

2.2)
Main> substitute 'a' 'i' "papauif"
"pipiuif" :: [Char]


Дополнительное задание
   Написать функцию, возвращающую список без элементов стоящих на чётных местах.

f :: String -> String
f [ ] = [ ]
f [a] = [a]
f (a:b:t) = a:f t

 

Если вам нравится то, что мы пишем, пожалуйста, нажмите на интересующую вас рекламу сбоку, сверху, или сразу после статьи. Будет стимул писать лучше и чаще. Хорошего вам дня.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий