Домашно 1

Пак е това време на годината!

Точно така, деца! Отново веселият Дядо Асистент ще потропа с червените ботушки по мързеливите ви недописали домашно задници!
Днес ще решим малко от задачките за първата домашна работа по функционално програмиране. И, имайки предвид специфичната тема, ще си позволя да направя малко отклонение:

Много ясно, че ако просто препишеш решенията тук, няма да минеш. Нали като те пита някой "Абе, тая част какво прави?" и няма да можеш да му отговориш?
Освен това самата проверка на "домашното" е под формата на контролно със задачи много подобни, но не същите, като тези тук. Даже са малко по-лесни от тези.


Най-добре първо си реши задачите, а после се върни тук, за да сравниш получените отговори

Предварителна информация

Тези решения използват за дадени следните процедури:

  • accumulate
  • map
  • filter
  • reduce
  • all?
  • any?
  • prime?
  • interval (Създава списък с числата от [a,b])
  • sum (Сума на елементи на списък)
  • prod (Произведение на елементи на списък)

Ако в момента не си в състояние да си ги напишеш самостоятелно1, най-добре си попрегледай лекциите, включително тези, и след това се върни, че да довършим.
А, впрочем, помниш ли как надълго и нашироко обяснявах как хубаво написани общи функции ще ни направят живота лесен по-късно? Е, това по-късно вече е сега.

Задача 1

Да се дефинира процедура за работа със списъци accumulate и чрез нея да се напишат функции на Schemе, които:
1. По дадени $x \in R, n \in N$ да изчислява израза:

(1)
\begin{align} \begin{eqnarray} \sum_{k=1}^n \cfrac{(-1)^kf_k}{p_k}x^k \end{align}

2. По дадена фунцкия f(x) и естествени числа a и b да намира най-голямата стойност на f в интервала $[a,b]$.
3. По дадена фунцкия f(x) и естествени числа a и b да намира най-малкото $x \in [a,b]$, за което f(x) достига максималната си стойност в $[a,b]$.

Задача 2

За даден полином

(2)
\begin{align} \begin{eqnarray} P(x) = \sum_{k=0}^n a_kx^k \end{align}

казваме, че се представя от списъка l, ако l се състои от всички неповтарящи се двойки от вида $(a_k, k)$, за които $a_k \ne 0$.
Да се напише програма, която:

  1. По даден списък L, който представя полином, и функция f, приемаща и връщаща реални числа, да връща функция g, за която $g(x) = P(f(x))$.
  2. Да се напише процедура, която приема два полинома, P и Q и генерира представяне за полинома $R(x) = P(Q(x))$.

Задача 3

Да се напише функция, която по даден списък от цели числа намира:

  1. НОД на всички числа, които са огледални на дадените
  2. Числото, което се получава при конкатенация на тези числа, които са сума на два точни квадрата.
  3. Числото, което в двоична бройна система представлява побивтово или на онези елементи, които след задраскването на всички техни четни цифри стават прости.

Задача 4

Да се напише програма, която приема списък от функции и връща тяхната композиция.
Тоест, ако приеме (f g h), ще върне функция приемаща един аргумент x и връщаща: f(g(h(x)))

Задача 5

1. Да се напише функция, която по дадени f : N → N и g : N3 → N
намира функцията h : N2 → N, за която:

(3)
\begin{align} \begin{eqnarray} h(a, 0) = f (a) \\ h(a, b + 1) = g(a, b, h(a, b)) \\ \end{align}

2. Да се напише функция, която по даден списък от функции L =
(f0 f1 … fk−1 ), които са от вида fi : N → N намира функция
h : N3 → N, за която:

(4)
\begin{align} \begin{eqnarray} h(ind, 0, arg) = f_ind (arg) \\ h(ind, count + 1, arg) = h(l, count, arg) \\ \end{align}

където l е остатъкът на find (count) при деление на k.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License