Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
kaize
1 / 1 / 1
Регистрация: 04.02.2015
Сообщений: 19
#1

Составить список произведения чисел в заданном дипазоне - Haskell

26.12.2017, 17:01. Просмотров 210. Ответов 7
Метки нет (Все метки)

Здравствуйте, задание такое, что нужно составить список произведения всех чисел в заданном диапазоне, отсортировать их в порядке убывания и удалить дубликаты, вот код:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
f1 _ [] = 0
f1 f el = f el 
 
f2 _ [] = []
f2 f el = f el 
 
delElem x l@(h:t) = if h == x then t else l
 
task1 = 
    let min1 = 1 in   
    let max1 = 9 in
      let lsts =  map (\x -> map (\y -> x * y) [x,x-1..min1]) 
                           [max1,max1-1..min1] in
    let getMax lsts = maximum $ map (f1 head) lsts in
    let delMax lsts m = map (f2 (delElem m)) lsts 
   
 
    in main lsts  
main = do
    print $ "Task 1 result = " ++ show task1
программа не компилируется выдает ошибки
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2017, 17:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Составить список произведения чисел в заданном дипазоне (Haskell):

Составить список простых чисел вида 2n+1
Составить список простых чисел вида 2n+1. Написать функцию для выбора k-го...

Функция произведения чисел
Создать функцию вычисления произведения чисел <m, на языке Haskell. Помогите...

Вывести список вершин на заданном уровне дерева
Добрый день! Дано бинарное дерево и номер уровня. Вывести список вершин на...

Создать список случайных чисел в заданном интервале не содержащийся в заданном списке
Задан упорядоченный по возрастанию целочисленный массив. Сформировать второй...

Составить алгоритм и код программы вычисления значения произведения при заданном условии
вот условие

Блок-схема алгоритма вычисления суммы и произведения четных чисел на заданном промежутке
Вычислить сумму и произведение четных чисел на промежутке .

7
KolodeznyDiver
2500 / 1650 / 203
Регистрация: 01.06.2013
Сообщений: 3,339
Записей в блоге: 7
26.12.2017, 19:28 #2
Лучший ответ Сообщение было отмечено kaize как решение

Решение

Функцию сортировки я использую готовую, стандартную.
Если хотите, вставьте какой ни будь вариант сортировки списка, которые легко гуглятся, например
https://smthngsmwhr.wordpress.com/20...ms-in-haskell/ .
На самом деле выполняется сортировка по возрастанию, но в процессе удаления дублей список переворачивается. В результате получается то, что требуется.
Haskell
1
2
3
4
5
6
7
8
9
10
11
import Data.List (sort)
 
task :: Integer -> Integer -> [Integer]
task xFrom xTo = let ~(h:t) = sort [a*b| a<-[xFrom .. xTo], b<-[xFrom .. xTo]]
                     f r p [] = p:r
                     f r p (x:xs) | p == x = f r p xs
                                  | otherwise = f (p:r) x xs
                 in f [] h t
 
main :: IO () 
main = print $ task 1 9
2
kaize
1 / 1 / 1
Регистрация: 04.02.2015
Сообщений: 19
26.12.2017, 19:34  [ТС] #3
KolodeznyDiver, спасибо большое)
1
Catstail
Модератор
23540 / 11650 / 2036
Регистрация: 12.02.2012
Сообщений: 18,994
27.12.2017, 12:21 #4
Если уж использовать стандартные функции, то:

Haskell
1
2
3
import Data.List
 
task n1 n2 = sort $ nub $ [x*y| x <- [n1..n2], y <- [n1..n2]]
0
KolodeznyDiver
2500 / 1650 / 203
Регистрация: 01.06.2013
Сообщений: 3,339
Записей в блоге: 7
27.12.2017, 12:30 #5
Catstail, порядок сортировки не тот
Haskell
1
2
3
4
5
import Data.List
import Data.Function
 
task :: Integer -> Integer -> [Integer]
task n1 n2 = sortBy (compare `on` negate)  $ nub $ [x*y| x <- [n1..n2], y <- [n1..n2]]
1
Catstail
Модератор
23540 / 11650 / 2036
Регистрация: 12.02.2012
Сообщений: 18,994
27.12.2017, 12:40 #6
А если почти "честно", то так:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
delEl :: (Eq a) => a -> [a] -> [a]
delEl _ [] = []
delEl y (x:xs) = if x==y then delEl y xs else x : (delEl y xs)
 
setOf :: (Eq a) => [a] -> [a]
setOf [] = []
setOf (x:xs) = x : (setOf $ delEl x xs)
 
delF :: (Ord a) => a -> [a] -> [a]
delF _ [] = []
delF y (x:xs) = if y==x then xs else x : (delF y xs)
 
vSort :: (Ord a) => [a] -> [a]
vSort [] = []
vSort x  = mi : (vSort $ delF mi x)
           where mi = maximum x 
 
task' n1 n2 =  (vSort . setOf)  [x*y| x <- [n1..n2], y <- [n1..n2]]
А прежнее решение можно "поправить" так:

Haskell
1
2
3
import Data.List
 
task n1 n2 = (reverse . sort . nub)  [x*y| x <- [n1..n2], y <- [n1..n2]]
0
KolodeznyDiver
2500 / 1650 / 203
Регистрация: 01.06.2013
Сообщений: 3,339
Записей в блоге: 7
27.12.2017, 14:12 #7
Цитата Сообщение от Catstail Посмотреть сообщение
vSort
Сортировка выбором. Ну или почти она.
0
Catstail
Модератор
23540 / 11650 / 2036
Регистрация: 12.02.2012
Сообщений: 18,994
27.12.2017, 14:19 #8
Именно!
0
27.12.2017, 14:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2017, 14:19
Привет! Вот еще темы с решениями:

Составить программу для вычисления произведения чисел
Составить программу для вычисления произведения чисел: 6, 12, 18 ...,60 ...

Составить программу вычисления произведения двух чисел
Помогите пожалуйста составить программу вычисления произведения двух чисел на...

Составить программу нахождения произведения нечётных чисел из [a;b]
Вот такие задачи надо сделать: 1.Составить программу нахождения произведения...

Найти сумму произведения четных чисел 1ой строки и произведения положительных чисел 3-го столбца
В матрице А(4;4) найти сумму произведения четных чисел 1ой строки и...


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

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

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