Цель работы: научится определять рекурсивные функции. Получить представление о механизме сопоставления с образцом. Приобрести навыки определения функций для обработки списков. на функциональном языке программирования haskell
Задание 1
Определите функцию, принимающую на вход целое n и возвращающую список, содержащий n элементов, упорядоченных по возрастанию.
* n-е треугольное число tn равно количеству одинаковых монет, из которых можно построить равносторонний треугольник, на каждой стороне которого укладывается n монет. Нетрудно убедится, что t1=1 и tn=n+tn-1
# n-е пирамидальное число pn равно количеству одинаковых шаров, из которых можно построить пирамиду с треугольным основанием, на каждой стороне которой укладывается n шаров. Нетрудно убедится, что p1=1 и pn=tn+pn-1)
Решение:
1)
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)
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)
[1,3,5,7,9] :: [Integer]
3)
Reading file "c:\haskell\Laba21.hs":
[2,4,6,8,10,12,14,16] :: [Integer]
4)
Reading file "c:\haskell\Laba21.hs":
[1,4,9,16,25,36,49,64] :: [Integer]
5)
[1,2,6,24,120] :: [Integer]
6)
[2,4,8,16,32,64,128] :: [Integer]
7)
Reading file "c:\haskell\Laba21.hs":
[1,3,6,10] :: [Integer]
8)
[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 [] = []
removeOdd (x:xs) = if odd x then removeOdd xs else x : removeOdd xs
2.2)
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)
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)
"pipiuif" :: [Char]
Дополнительное задание
Написать функцию, возвращающую список без элементов стоящих на чётных местах.
f [ ] = [ ]
f [a] = [a]
f (a:b:t) = a:f t
Если вам нравится то, что мы пишем, пожалуйста, нажмите на интересующую вас рекламу сбоку, сверху, или сразу после статьи. Будет стимул писать лучше и чаще. Хорошего вам дня.