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

Содержимое удалено Содержимое добавлено
Строка 134:
##<math>summPower</math>:
##*<math>summPower(n, 0) = 1</math>
##*<math>summPower(n, p) = (\frac{1 / }{power(n, p)}) + summPower(n, p - 1)</math>
##<math>exponent</math>:
##Exponent:
Exponent ##*<math>exponent(Nn, 0) = 1</math>
Exponent ##*<math>exponent(Nn, Pp) = \frac{power(Power (Nn, Pp) / Factorial }{factorial(P)p)} + Exponent exponent(Nn, Pp - 1)</math>
Factorial ##*<math>factorial(0) = 1</math>
Factorial ##*<math>factorial(Nn) = Nn * Factorial factorial(Nn - 1)</math>
#Объяснение работы операции <math>prefix</math> можно легко провести в три приёма (равно так же, как и приведено в примере). Для того чтобы не загромождать объяснения, здесь наряду с функциональной записью операции <math>prefix</math> также используется инфиксная запись посредством символа двоеточия.
##Первый пример работы операции — определение самой операции. Рассматривать его нет смысла, ибо операция <math>prefix</math> определяется именно таким образом.
##<math>prefix (a1a_{1}, [b1b_{1}, b2b_{2}]) = prefix (a1a_{1}, b1 b_{1}: (b2 b_{2}: [])) = a1 a_{1}: (b1 b_{1}: (b2 b_{2}: [])) = [a1a_{1}, b1b_{1}, b2b_{2}]</math> (Эти преобразование проведены по определению списка).
##<math>prefix ([a1a_{1}, a2a_{2}], [b1b_{1}, b2b_{2}]) = prefix ([a1a_{1}, a2a_{2}], b1 b_{1}: (b2 b_{2}: [])) = ([a1a_{1}, a2a_{2}]) : (b1 b_{1}: (b2 b_{2}: [])) = [[a1a_{1}, a2a_{2}], b1b_{1}, b2b_{2}]</math>.
(Эти преобразование проведены по определению списка).
##В качестве примера работы функции Append<math>append</math> рассмотрим сцепку двух списков, каждый из которых состоит из двух элементов: <math>[a, b]</math> и <math>[c, d]</math>. Опять же для того, чтобы не загромождать объяснение, для записи операции <math>prefix</math> используется инфиксная форма. Для более полного понимания приведенногоприведённого объяснения необходимо помнить определение списка.
##prefix ([a1, a2], [b1, b2]) = prefix ([a1, a2], b1 : (b2 : [])) = ([a1, a2]) : (b1 : (b2 : [])) = [[a1, a2], b1, b2].
Append ##*<math>append([a, b], [c, d]) = a : Append append([b], [c, d]) = a : (b : Append append([], [c, d])) = a : (b : ([c, d])) = a : (b : (c : (d : []))) = [a, b, c, d]</math>.
##В качестве примера работы функции Append рассмотрим сцепку двух списков, каждый из которых состоит из двух элементов: [a, b] и [c, d]. Опять же для того, чтобы не загромождать объяснение, для записи операции prefix используется инфиксная форма. Для более полного понимания приведенного объяснения необходимо помнить определение списка.
Append ([a, b], [c, d]) = a : Append ([b], [c, d]) = a : (b : Append ([], [c, d])) = a : (b : ([c, d])) = a : (b : (c : (d : []))) = [a, b, c, d].
#Функции, работающие со списками:
##<math>getN</math>:
##GetN:
GetN ##*<math>getN(Nn, []) = \_</math>
GetN ##*<math>getN(1, H:TL) = Hhead(L)</math>
GetN ##*<math>getN(Nn, H:TL) = GetN getN(Nn - 1, Ttail(L))</math>
##<math>listSumm</math>:
##ListSumm:
ListSumm ##*<math>listSumm([], L) = L</math>
ListSumm ##*<math>listSumm(L, []) = L</math>
ListSumm ##*<math>listSumm(H1:T1L_{1}, H2:T2L_{2}) = prefix ((H1head(L_{1}) + H2head(L_{2})), ListSumm listSumm(T1tail(L_{1}), T2tail(L_{2})))
##<math>oddEven</math>:
##OddEven:
OddEven ##*<math>oddEven([]) = []</math>
OddEven ##*<math>oddEven([Xx]) = [Xx]</math>
OddEven ##*<math>oddEven(H1:[H2:T]L) = prefix (prefix (H2head(tail(L)), H1head(L)), OddEven pddEven(Ttail(L)))</math>
##<math>reverse</math>:
##Reverse:
Reverse ##*<math>reverse([]) = []</math>
##*<math>reverse(L) = append(reverse(tail(L)), [head(L)])</math>
Reverse (H:T) = Append (Reverse (T), [H])
##<math>map</math>:
##Map:
Map ##*<math>map(Ff, []) = []</math>
Map ##*<math>map(Ff, H:TL) = prefix (F f(Hhead(L)), Map map(Ff, Ttail(L)))</math>