Advertisement
Guest User

Untitled

a guest
Mar 8th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 5.78 KB | None | 0 0
  1.  
  2. // Лабораторная работа №2
  3.  
  4. open System
  5.  
  6. let printTask(number: int, description: string) = printfn "\nЗадание %i\n%A\n" number description
  7.  
  8. [<EntryPoint>]
  9. let main argv =
  10.     printfn "Лабораторная работа №2"
  11.  
  12.     // Задание 1
  13.     printTask(1, "Карирование")
  14.  
  15.     let uncarry(a: int, b: int) = a * b
  16.     let carry(a: int)(b: int) = a * b
  17.  
  18.     let a = 2
  19.     let b = 3
  20.  
  21.     let uncarryTest = uncarry(a, b)
  22.     let carryTest = carry a b // или carry(a)(b)
  23.  
  24.     printfn "uncarry(%i, %i) = %i" a  b uncarryTest
  25.     printfn "carry %i %i = %i" a  b carryTest
  26.  
  27.     // Задание 2
  28.     printTask(2, "Рекурсивное вычисление суммы целых чисел в заданном диапазоне")
  29.  
  30.     let rec sum a b = if a=b then b else b+sum a (b-1)
  31.  
  32.     let sumTest = sum 2 5
  33.     printfn "sum %i %i = %i" 2  5 sumTest
  34.  
  35.     // Задание 3
  36.     printTask(3, "Вычисление суммы целых чисел в заданном диапазоне в виде хвостовой рекурсии")
  37.  
  38.     let rec Sum_tr(a: int, b: int, acc: int):int =
  39.         if a=b then acc
  40.         else Sum_tr(a, b-1, b-1+acc)
  41.     let rec Tsum a b = Sum_tr(a, b, b)
  42.  
  43.     let tsumTest = Tsum 2 5
  44.     printfn "tsum %i %i = %i" 2  5 tsumTest
  45.  
  46.     // Задание 4
  47.     printTask(4, "Конечный автомат из трех состояний в виде взаимно-рекурсивных функций")
  48.  
  49.     //Автомат из 3 состояний (на основе примера из методички)
  50.     // 1 - (+1) 2
  51.     // 2 - (+1) 3
  52.     // 3 - (+1) 4
  53.     // 4 - (*2) 16
  54.     // 5 - (*2) 25
  55.     // 6 - (*2) 36
  56.     // 7 - (*3) 343
  57.     // 8 - (*3) 512
  58.     // 9 - (*3) 729
  59.     // 10 - (*3) 1000
  60.  
  61.     let rec State1(x:int) =
  62.         printfn "%i - (+1) %i" x (x+1)
  63.         let x_next = x+1
  64.         if x_next>3 then State2(x_next)
  65.         else State1(x_next)
  66.     and State2(x:int) =
  67.         printfn "%i - (*2) %i" x (x*2)
  68.         let x_next = x+1
  69.         if x_next>6 then State3(x_next)
  70.         else State2(x_next)
  71.     and State3(x:int) =
  72.         printfn "%i - (*3) %i" x (x*3)
  73.         let x_next = x+1
  74.         if x_next<=10 then State3(x_next)
  75.        
  76.     //Вызов с начальным условием
  77.     State1(1)
  78.  
  79.     // Задание 5
  80.     printTask(5, "Функция, которая принимает 3 целых числа и лямбда-выражение для их суммирования в виде кортежа и в каррированном виде.")
  81.  
  82.     let UncarryFunWith3(a: int, b: int, lambda: int*int->int) = lambda(a, b)  
  83.     let uncarryFunSumTest = UncarryFunWith3(2, 3, fun(a, b) -> a+b)  
  84.     printfn "UncarryFunWith3(2, 3, fun(a, b) -> a+b) = %i" uncarryFunSumTest
  85.  
  86.     let CarryFunWith3(a: int, b: int, lambda: int->int->int) = lambda a b  
  87.     let carryFunSumTest = CarryFunWith3(2, 3, fun a b -> a+b)  
  88.     printfn "XarryFunWith3(2, 3, fun a b -> a+b) = %i" carryFunSumTest
  89.  
  90.     // Задание 6
  91.     printTask(6, "С использованием list comprehension для списка [1..10] верните список кортежей. Каждый кортеж содержит элемент списка, его квадрат и куб.")
  92.  
  93.     let list = [for x in [1..10] do yield (x, x*x, x*x*x)]
  94.     printfn "%A" list
  95.  
  96.     // Задание 7
  97.     printTask(7, "Напишите два варианта функции, которая принимает на вход список и возвращает квадраты его значений. Необходимо использовать свойства списка Head и Tail. Первый вариант функции использует оператор if, второй вариант использует сопоставление с образцом.")
  98.  
  99.     let rec SquareList1(list: int list): int list =
  100.         if list.IsEmpty then []
  101.         else (list.Head*list.Head)::SquareList1(list.Tail)
  102.     let squareList1Test = SquareList1([1..4])
  103.     printfn "SquareList1([1..4]) = %A" squareList1Test
  104.  
  105.     let rec SquareList2 = function
  106.         | [] -> []
  107.         | x::xs -> x*x::SquareList2(xs)
  108.     let squareList2Test = SquareList2([1..4])
  109.     printfn "SquareList2([1..4]) = %A" squareList2Test
  110.  
  111.     // Задание 8
  112.     printTask(8, "Последовательно примените к списку функции map, sort, filter (в любом порядке).")
  113.  
  114.     let testList = [1..10]
  115.     printfn "testList = %A" testList
  116.  
  117.     let mapList = List.map(fun x->x*x*x) testList
  118.     printfn "..map.. %A" mapList
  119.  
  120.     let sortList = List.rev (List.sort mapList)
  121.     printfn "..sort.. %A" sortList
  122.  
  123.     let filterList = List.filter(fun x->x % 2 = 0) sortList
  124.     printfn "..filter.. %A" filterList
  125.  
  126.     // Задание 9
  127.     printTask(9, "Реализуйте предыдущий пункт с использованием оператора потока \'|>\'")
  128.  
  129.     let newList = testList |> List.map(fun x->x*x*x) |> List.rev |> List.filter(fun x->x % 2 = 0)
  130.     printfn "..map..sort..filter.. %A" newList
  131.  
  132.     // Задание 10
  133.     printTask(10, "Реализуйте предыдущий пункт с использованием оператора композиции функций \'>>\'")
  134.  
  135.     let ListFunc = List.map(fun x->x*x*x) >> List.rev >> List.filter(fun x->x % 2 = 0)
  136.     let newList1 = ListFunc testList
  137.     printfn "..map..sort..filter.. %A" newList1
  138.  
  139.     //|> ignore - перенаправление потока с игнорирование результата вычисления
  140.     Console.ReadLine() |> ignore
  141.     0 // возвращение целочисленного кода выхода
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement