{- Упражнение №7 - подготовка за първо контролно -} module Exercise7 where {- Полином: P(x) = a0*x^n + a1*x^(n-1) + ... + an-1*x + an Можем да представим полином като списък от едночлени, където едночлен е двойка от ненулев коефициент ai и степен n. -} type Monome = (Float, Int) type Polynome = [Monome] {- Да се напише функция, която отпечатва едночлен и полином в стринг Пример: printPolynome [(1.5,3),(2.5,1),(3.3,0)] ---> 1.5*x^3 + 2.5*x + 3.3 -} printMonome :: Monome -> String printMonome (coef, 0) = (show coef) printMonome (coef, 1) = (show coef) ++ "*x" printMonome (coef, deg) = (show coef) ++ "*x^" ++ (show deg) printPolynome :: Polynome -> String printPolynome [m] = printMonome m printPolynome (m:ms) = printMonome m ++ " + " ++ printPolynome ms {- Да се напише функция, която събира два полинома. Считаме, че едночлените са подредени по намаляващ ред на степените. Пример: printPolynome (addPolynomes [(2,5),(3,3),(4,1)] [(2,4),(2,3),(5,0)]) връща като резултат: 2*x^5 + 2*x^4 + 5*x^3 + 4*x + 5 -} addPolynomes :: Polynome -> Polynome -> Polynome -- първо лесните случаи addPolynomes [] l = l addPolynomes l [] = l -- сега интересната част addPolynomes ((coef1,deg1):xs) ((coef2,deg2):ys) | deg1 > deg2 = (coef1,deg1):addPolynomes xs ((coef2,deg2):ys) | deg2 > deg1 = (coef2,deg2):addPolynomes ((coef1,deg1):xs) ys {- сега тук: ВНИМАНИЕ! Какво става ако добавим полиномите 2*x^2 - x и x + 1? Не трябва да получаваме 2*x^2 + 0*x + 1, а просто 2*x^2 + 1. Затова ще проверим дали при равни степени коефициентите се унищожават -} | deg1 == deg2 && coef1 + coef2 /= 0 = (coef1+coef2,deg1):addPolynomes xs ys | otherwise = addPolynomes xs ys