помогите с 4 задачами для зачета

 
0
 
Functional languages
ava
Lunt | 11.05.2012, 16:38
привет всем, помогите с задачей, я пока что 0 в хаскеле и поэтому не знаю как решить.
помогите пожалуста, мне надо 4 задачи исправить...
1 сделал, спс народ

2.

4-30: дублирование кода, перепишите через 4-31

{4-30}
Напишите функцию \prg{dPdX :: Poly -> Poly}, выполняющую дифференцирование многочлена.

Мое решение:
[

color=red]\begin{code}
dPdX :: Poly -> Poly
dPdX (MkPoly (x:xs)) = MkPoly (f xs 1)
   where  f []     n = []
          f (y:ys) n = (y*n):(f ys (n+1))
\end{code}[/color]


{4-31}
Напишите функцию \prg{dNPdXN :: Poly -> Int -> Poly}, вычисляющую производную \prg{dNPdXN p $n$} заданного порядка $n \geq 0$ от полинома \prg{p}.

Мое решение:

\begin{code}
fact' :: Float -> Float -> [Float]
fact' poly n = (product [(poly - m)|m<-[0..(n-1)]]):(fact' (poly + 1) n)

dNPdXN :: Poly -> Int -> Poly
dNPdXN poly 0 = poly
dNPdXN (MkPoly xs) n = MkPoly (zipWith (*) (fact' poly poly) (drop n xs))
               where poly = fromIntegral n
\end{code}


3.

4-50: не определен случай, когда список переменных пуст

{4-50}
Пусть задано арифметическое выражение и означивание всех переменных из выражения некими значениями.  Означивание задается в виде списка пар <<переменная~--- значение>>, например: \prg{[("p"{}, -1.7), ("q"{}, 3.14)] :: [(String,Float)]}.

Напишите функцию
\begin{center}
  \prg{evalEV :: Expr -> [(String,Float)] -> Float},
\end{center}
которая вычисляет значение арифметического выражения при заданных значениях переменных.

Мое решение:

[color=red]\begin{code}
evalEV :: Expr -> [(String,Float)] -> Float
evalEV (Add e1 e2) xs = (evalEV e1 xs) + (evalEV e2 xs)
evalEV (Mul e1 e2) xs = (evalEV e1 xs) * (evalEV e2 xs)
evalEV (ConstF c)  xs = c
evalEV (VarF   e)  xs = find e xs
     where find p ((a,b):ys) = if (a==p) then b else find p ys
\end{code}[/color]


4.

4-54: перепишите через абстракцию списков


{4-54}
Определите функцию
\begin{center}
   \prg{findContacts :: Contacts -> Name -> [(Phone, Email)]},
\end{center}
которая из списка контактов по имени персоны разыскивает все телефоны и адреса персоны.

Мое решение:

[color=red]\begin{code}
findContacts :: Contacts -> Name -> [(Phone, Email)]
findContacts xs n = nub (map mailPhone (filter g xs))
   where g (s,_,_) = s == n
         mailPhone (_,p,e) = (p,e)
\end{code}[/color]


%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%
\subsection{\prg{(Tree a)}: деревья поиска}
Comments (8)
ava
dlebedev | 12.05.2012, 06:59 #
1.

hanoiSteps :: Int -> [(Int, Int)]
hanoiSteps n | n < 0 = []
             | othewise = hanoiSteps' n 1 3

hanoiSteps' 1 a n = [(a, n)]
hanoiSteps' i a n = (hanoiSteps' (i-1) a b)++[(a, n)]++(hanoiSteps' (i-1) b n)
                            where b = 6-a-n

Как-то так. При отрицательном n выдает пустой список. Можно выводить ошибку:

hanoiSteps :: Int -> [(Int, Int)]
hanoiSteps n | n < 0 = error "Разрешено вводить только положительное число!"
             | othewise = hanoiSteps' n 1 3

hanoiSteps' 1 a n = [(a, n)]
hanoiSteps' i a n = (hanoiSteps' (i-1) a b)++[(a, n)]++(hanoiSteps' (i-1) b n)
                            where b = 6-a-n


added later:
Дальше глаза ломать не стал. Потрудитесь хотя бы очистить текст от теховского форматирования. Читать же невозможно.
ava
Lunt | 12.05.2012, 08:02 #
я выделил код программы красным, так что надеюсь теперь ты сможешь мне помоч
ava
k0rvin | 12.05.2012, 08:29 #
Цитата (Lunt @ 12.5.2012,  08:02)
я выделил код программы красным, так что надеюсь теперь ты сможешь мне помоч

Нет, не выделил. \begin{code} -- это не код программы
ava
Lunt | 12.05.2012, 10:25 #
все исправил 1 задачу  но с остальными проблема, помогите пожайлусто
ava
dlebedev | 12.05.2012, 16:21 #
Цитата (Lunt @  11.5.2012,  15:38 findReferencedText)
Напишите функцию \prg{dNPdXN :: Poly -> Int -> Poly}, вычисляющую производную \prg{dNPdXN p $n$} заданного порядка $n \geq 0$ от полинома \prg{p}.

Вот такие участки текста все еще весьма трудно читаемы. Предполагаю, что второе задание нужно было решить так:

dPdX :: Poly -> Poly
dPdX poly = dNPdXN poly 1

Хотя не уверен, что все еще правильно помню смысл слов "дифференцирование многочлена". Первый курс был очень уж давно...

added later:
3.

evalEV :: Expr -> [(String,Float)] -> Float
evalEV (Add e1 e2) xs = (evalEV e1 xs) + (evalEV e2 xs)
evalEV (Mul e1 e2) xs = (evalEV e1 xs) * (evalEV e2 xs)
evalEV (ConstF c)  xs = c
evalEV (VarF   e)  xs | null xs = error "Задано неправильное выражение, либо неверный список переменных!"
                      | otherwise = find e xs
     where find p ((a,b):ys) = if (a==p) then b else find p ys


Как-то так, наверное. Вы задали рекурсивную функцию без условия корректного выхода из нее в случае, если условие рекурсии не будет выполнено.
ava
dlebedev | 12.05.2012, 17:06 #
4.

findContacts :: Contacts -> Name -> [(Phone, Email)]
findContacts xs n = nub [ (p,e) | (s,p,e) <- xs, s == n ]

Как-то так должно выглядеть, я думаю...
ava
Lunt | 12.05.2012, 23:57 #
огромное спасибо, если чем то могу помочь или чтото сделать обращайся (програмирую на c++ c#) хаскель долг висит со 2 курса.... надеюсь теперь примет задачи.
ava
k0rvin | 17.05.2012, 13:41 #
Блин, я прошу прощенья за оффтоп, но не уж-то так сложно было убрать TeX'овую разметку?
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  k0rvin   dlebedev   Lunt
advanced
Submit