Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
ЮРИК5
0 / 0 / 0
Регистрация: 19.10.2009
Сообщений: 9
#1

Надо сделать несколько простых задач на Хаскел очень надо

20.12.2011, 19:50. Просмотров 1752. Ответов 8
Метки нет (Все метки)

1. Выбрать N самых больших чисел из последовательности чисел.
2. Выбрать N самых маленьких чисел из последовательности чисел.
3. Вставить элемент в список на заданное место.
4. Вставить список в другой список, начиная с указанного места.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 19:50
Ответы с готовыми решениями:

Ребята , прошу посмотреть, надо сделать очень слайдер как надо
Сделал с помощью плагина. Плагин vSlider сайт http://bubnovsky-perm.ru/ Не...

3 разных, простых заданий. очень надо.
1.Определить можно ли с данным числам а и б числами, решить неравенство ...

Надо выбрать, пожалуйста, очень надо
что будет лучше i7 12gb RAM 750 hdd Nvideo 840m или такой же ноут но i7...

Условный оператор (не очень понятно что надо сделать)
Здравствуйте) Помогите пожалуйста определиться, что конкретно нужно сделать в...

Надо сделать задание (надо найти среднее геометрическое)
Вот задание: найти среднее геометрическое n значений Z1,Z2,...Zn по формуле...

8
Mysterious Light
Эксперт по математике/физике
3937 / 1916 / 382
Регистрация: 19.07.2009
Сообщений: 2,927
Записей в блоге: 21
20.12.2011, 22:38 #2
Haskell
1
2
3
4
5
6
7
8
getMin :: Ord a => Int -> [a] -> [a]
getMin n = take n . sort
getMax :: Ord a => Int -> [a] -> [a]
getMax n = take n . reverse . sort
insrt :: a -> Int -> [a] -> [a]
insrt element pos list = let (h,t)=splitAt (pos-1) list in h++(element:t)
insertList :: [a] -> Int -> [a] -> [a]
insertList sublist pos list = let (h,t) = splitAt(pos-1)  list in h++sublist++t
0
ЮРИК5
0 / 0 / 0
Регистрация: 19.10.2009
Сообщений: 9
21.12.2011, 17:52  [ТС] #3
Пишет ошибку Undefined variable "sort"
0
Mysterious Light
Эксперт по математике/физике
3937 / 1916 / 382
Регистрация: 19.07.2009
Сообщений: 2,927
Записей в блоге: 21
23.12.2011, 05:42 #4
А, прости, эта функция из библиотеки List (её можно подключить в интерпретаторе, набрав ":m +List", в коде её подключение производится коммандой "import List")

В принципе, можно написать аналог:
Haskell
1
2
sort [] = []
sort (x:xs) = sort (filter (<=x) xs) ++ [x] ++ sort(filter (>x) xs)
0
Catstail
Модератор
23550 / 11660 / 2040
Регистрация: 12.02.2012
Сообщений: 19,018
08.08.2012, 18:28 #5
Вот решение первой и второй задач:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- Удалить все вхождения элемента из списка
 
delEl :: Int -> [Int] -> [Int]
delEl n []       = []
delEl n (x:xs) | (x == n)  = delEl n xs
               | otherwise = x : (delEl n xs)
 
-- Дать список из n максимальных (без повторения)
 
getMaxn :: [Int] -> Int -> [Int]
getMaxn x n | (n == 1)  = [ maxx ]
            | otherwise = maxx : (getMaxn (delEl maxx x) (n-1))
              where maxx = maximum x
 
-- Дать список из n минимальных (без повторения)
 
getMinn :: [Int] -> Int -> [Int]
getMinn x n | (n == 1)  = [ minx ]
            | otherwise = minx : (getMinn (delEl minx x) (n-1))
              where minx = minimum x
 
-- Проверка
 
Main> getMaxn [1,2,3,11,22,33,1,2,3,55,22,22,11] 3
[55,33,22]
Main> getMinn [1,2,3,11,22,33,1,2,3,55,22,22,11] 3
[1,2,3]
Добавлено через 6 минут
Цитата Сообщение от Mysterious Light Посмотреть сообщение
getMin n = take n . sort
- а подобные решения, мне кажется, не вполне корректны. Рассмотрим список [1,1,1,2,3,4]. Два минимальных это [1,1] или [1,2]? Мне кажется, что второе...
0
Mysterious Light
Эксперт по математике/физике
3937 / 1916 / 382
Регистрация: 19.07.2009
Сообщений: 2,927
Записей в блоге: 21
08.08.2012, 19:06 #6
Цитата Сообщение от Catstail Посмотреть сообщение
а подобные решения, мне кажется, не вполне корректны. [...] Мне кажется, что второе...
<sarcasm>Вам показалось</sarcasm>
Подобное указывается в описании функции. Или уточняется у заказчика, что ему нужно.
Хотя разница здесь в том, считаем ли мы различимыми два равных числа, на разных позициях стоящих. Мне как-то подумалось, что просят найти [1,1], ведь в условии сказано "последовательность" чисел ([1,1,1,2,3,4]), а не "множество" ({1,2,3,4})
0
Catstail
Модератор
23550 / 11660 / 2040
Регистрация: 12.02.2012
Сообщений: 19,018
08.08.2012, 19:25 #7
"Подобное указывается в описании функции. Или уточняется у заказчика, что ему нужно" - согласен. Но у Вашего решения есть, на мой взгляд, очевидный недостаток: если к-во минимальных/максимальных задано не очень большим, а список велик, то на сортировку уйдет много ресурсов...
0
Mysterious Light
Эксперт по математике/физике
3937 / 1916 / 382
Регистрация: 19.07.2009
Сообщений: 2,927
Записей в блоге: 21
08.08.2012, 20:12 #8
Сортировка-то разная бывает, и у нас же она ленивая. Тогда проигрыш может быть и не столь заметным.
Пусть для определенности будем решать задачу в моей постановке (когда ответ [1,1]), в Вашем решении достаточно 6 строчку (delEl n (x:xs) | (x == n) = xs). Тогда наши решения эквивалентны, если под sort понимать сортировку выборкой. Правда в Data.List, как я понял, реализована сортировка вставкой, что, как Вы заметили, неоптимально, т.к. весь список будет отсортирован
Haskell
1
2
3
4
5
6
sort :: (Ord a) => [a] -> [a]
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
#ifdef USE_REPORT_PRELUDE
sort = sortBy compare
sortBy cmp = foldr (insertBy cmp) []
#else
Если вместо это использовать
Haskell
1
2
sort [] = []
sort (x:xs) = sort [y|y<-xs, y<x] ++ [x] ++ sort [y|y<-xs, y>=x]
то опять же наши решения будут одинаковыми, поскольку лень не даст отсортировать списку больше, чем нужно для нас.

Вопрос о скорости/оптимальности, конечно, важен, но не только на этом останавливаться стоит. Особенно, если стоит задача написать быстро и понятно.
Так, я нахожу код take n . sort и map head . take n . group . sort говорящим за себя.
0
Catstail
Модератор
23550 / 11660 / 2040
Регистрация: 12.02.2012
Сообщений: 19,018
08.08.2012, 20:35 #9
Согласен...
0
08.08.2012, 20:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2012, 20:35

Надо сделать несколько курсоров мыши на экране
Подскажите, возможно ли реализовать такую задачу: Нужно сделать одновременно...

Есть предел. Надо т.е разделить на высшую степень числитель со знаменателем. Но там корни с разными степенями. Что с этими корнями сделать надо?
Добрый день. Подскажите пожалуйста. Есть предел. Надо т.е разделить на высшую...

НАрод, пожалуста, с этого сайта задачу, очень надо сделать задачу
http://www.delphiplus.org/praktikum-po-delphi/prakticheskaya-rabota-34-igra.html


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru