Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/50: Рейтинг темы: голосов - 50, средняя оценка - 4.54
2 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 70

Написать функцию попарного сложения элементов двух списков

26.09.2011, 22:06. Показов 10712. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать функцию попарного сложения элементов двух СПИСКОВ. Учесть, что списки м.б. РАЗНОЙ ДЛИНЫ!!! Помогите пож-та новичку.
Вот что я написала:
Haskell
1
2
3
4
5
lab22 [][] =[]
--lab22 _[] = []
--len [] = 0
--len s = 1+ len (tail s) 
lab22 as bs = (head as + head bs)   :  lab22 (tail as) (tail bs)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2011, 22:06
Ответы с готовыми решениями:

Функция сложения элементов двух списков
Доброго времени суток!!! Поскольку я новичок, помогите пожалуйста, следует написать функцию сложения элементов двух списков, которая...

Clojure Создание третьего списка путём сложения элементов двух списков
Добрый день!)Дана такая задача Даны 2 списка, создать третий путем сложения поочередно элементов 1й элемент нового списка это сумма...

Предикат попарного сложения элементов в списке (strawberry prolog)
Всем доброй ночи! Прошу помощи в реализации предиката попарного сложения элементов в списке на strawberry prolog, на примере: ?-...

17
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.09.2011, 02:54
Haskell
1
2
3
4
add :: (Num a) => [a] -> [a] -> [a]
add _ [] = []
add [] _ = []
add (x:xs) (y:ys) = (x + y) : add xs ys
Ну или проще:
Haskell
1
2
add :: (Num a) => [a] -> [a] -> [a]
add = zipWith (+)
3
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.03.2012, 08:18
Ну а если
Цитата Сообщение от victory19933 Посмотреть сообщение
Учесть, что списки м.б. РАЗНОЙ ДЛИНЫ!!!
предполагает, что должно быть максимальное количество элементов, то
Haskell
1
2
3
4
sumLists :: Num a => [a] -> [a] -> [a]
sumLists [x] [] = [x]
sumLists [] [x] = [x]
sumLists (x:xs) (y:ys) = (x + y) : sumLists xs ys
Haskell
1
2
3
4
5
*Main> sumLists [0..3] [0..4]
[0,2,4,6,4]
*Main> sumLists [0..5] [0..4]
[0,2,4,6,8,5]
*Main>
2
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
18.11.2012, 12:23
Haskell
1
2
3
4
withLists :: (a -> a -> a) -> [a] -> [a] -> [a]
withLists f x [] = x
withLists f [] x = x
withLists f (x:xs) (y:ys) = (f x y) : withLists f xs ys
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
18.11.2012, 14:24
Вот решение, "спасающее" zipWith (на случай списков разной длины):

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sumLists :: Num a => [a] -> [a] -> [a]
sumLists x y | lx == ly  = zipWith (+) x y
             | lx > ly   = zipWith (+) x (y ++ (replicate (lx-ly) 0)) 
             | otherwise = zipWith (+) (x ++ (replicate (ly-lx) 0)) y
             where lx=(length x)
                   ly=(length y)
 
Main> sumLists [1,2,3] [1,2,3]
 
[2,4,6]
 
Main> sumLists [1,2,3] [1,2,3,44]
 
[2,4,6,44]
1
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
13.01.2017, 06:26
Небольшое расширение темы, если списков не 2, а 3 и необходимо чтобы суммирование проходило только по длине самого короткого массива. Написал такое решение. Функции, конечно, не будут работать со списком без элементов.

Ну хочу для начала определить длину самого короткого

Haskell
1
2
val_min (x:xs) (y:ys) (z:zs) = if length (x:xs) == 0 || length (y:ys) == 0 || length (z:zs) == 0 then 0
                                                                                                 else (minimum ((length (x:xs)) : (length (y:ys)) : (length (z:zs)) : []))
И сама функция, хаскеллисты покритикуйте пожалуйста.

Haskell
1
2
3
let th_ar x y z = x+y+z
 
ad_ap_el_Lists th_ar (x:xs) (y:ys) (z:zs) = (th_ar x y z) : ad_ap_el_Lists th_ar (take val_min xs) (take val_min ys) (take val_min zs)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
13.01.2017, 09:06
Для трех списков, мне кажется, нет необходимости искать длину самого короткого. Все можно сделать в один проход:

Haskell
1
2
3
4
sum3lists [] _ _ = []
sum3lists _ [] _ = []
sum3lists _ _ [] = []
sum3lists (x:xs) (y:ys) (z:zs) = (x+y+z) : sum3lists xs ys zs
Интереснее обобщить задачу: сложить произвольное количество списков разной длины (аргумент - список списков). Вот мое решение:

Haskell
1
2
sumNlists x | ([] `elem` x) = []
            | otherwise = (sum $ map head x) : (sumNlists $ map (drop 1) x)
4
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
13.01.2017, 09:41
`elem` проверяет есть ли что-то в списке, так ведь? Только ваше первое решение до конца не компилируется - там нужно перебрать 3!-1 варианта сопоставления с образцом, я не ошибаюсь?

Добавлено через 8 минут
error: parse error on input ‘Ghci41.sum3lists’

Вы какой-то модуль еще использовали для написания функции?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
13.01.2017, 09:54
Цитата Сообщение от SKY_SHY Посмотреть сообщение
`elem` проверяет есть ли что-то в списке, так ведь?
- да.

А по поводу компиляции - вот код, который успешно компилируется и выполняется:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import System.IO
 
sum3lists [] _ _ = []
sum3lists _ [] _ = []
sum3lists _ _ [] = []
sum3lists (x:xs) (y:ys) (z:zs) = (x+y+z) : sum3lists xs ys zs
 
main = do
       putStrLn "Please, enter the first list"
       l1 <- getLine
       putStrLn "Please, enter the second list"
       l2 <- getLine
       putStrLn "Please, enter the third list"
       l3 <- getLine
       putStrLn $ show $ sum3lists (read l1) (read l2) (read l3)
Цитата Сообщение от SKY_SHY Посмотреть сообщение
там нужно перебрать 3!-1 варианта сопоставления с образцом, я не ошибаюсь?
- по-моему, всего три образца... Если любой из списков пуст, результат равен пустому списку.
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
13.01.2017, 14:27
Цитата Сообщение от SKY_SHY Посмотреть сообщение
покритикуйте пожалуйста
Бред собачий:
Цитата Сообщение от SKY_SHY Посмотреть сообщение
Ну хочу для начала определить длину самого короткого
- списки в ленивом языке бывают бесконечные, упаритесь длину определять

Цитата Сообщение от Catstail Посмотреть сообщение
Интереснее обобщить задачу
Haskell
1
2
3
4
5
mapcar :: ([a] -> b) -> [[a]] -> [b]
mapcar f ls | any null ls = []
            | otherwise   = f (map head ls) : mapcar f (map tail ls)
 
main = print $ mapcar sum [[1,2,3],[4,5,6],[7,8,9,10]]
PS написав, увидел, что это один в один решение Catstail. Придется написать нового кота
Haskell
1
mapcar f = map f . transpose
, но результат на подсписках неодинаковой длины другой. Допилим первого кота до соответствия второму:
Haskell
1
2
3
4
mapcar :: ([a] -> b) -> [[a]] -> [b]
mapcar f ls | null lf = []
            | otherwise   = f (map head lf) : mapcar f (map tail lf)
            where lf = filter (not . null) ls
3
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
13.01.2017, 15:37
Ivana у вас в переменную ls передается 1 список?

И filter отбрасывает списки без ничего.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
13.01.2017, 15:49
SKY_SHY, что у меня передается в постоянную () ls, явно видно из явно указанного типа функции А что делает filter, ясно из его семантики.
1
Модератор
 Аватар для Curry
5158 / 3487 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
13.01.2017, 16:37
Цитата Сообщение от Catstail Посмотреть сообщение
Интереснее обобщить задачу: сложить произвольное количество списков разной длины
Вообще то, мне кажется, самое правильное решение у вас (и первое у _Ivana), оно и мне в голову пришло, но если дальше пошли фильтры, y-комбинаторы и гиломорфизмы неподвижной точки, то приведу такое
Haskell
1
sumNlists = foldl1 (zipWith (+))
4
13.01.2017, 20:00

Не по теме:

Интересно, что в Лиспе похожее решение выглядит так:

Lisp
1
2
(defun add-lists (&rest lists)
  (apply 'mapcar (cons '+ lists)))

0
14.01.2017, 02:14

Не по теме:

А на языке Elixir решение м.б. такое

Ruby
1
2
3
  def sumNlists l do
    Enum.zip(l) |> Enum.map(&(Tuple.to_list(&1) |> Enum.sum))
  end
(к чему я это здесь написал?)

0
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
18.03.2017, 14:55
Вообще-то, реализация от Catstail выдает ошибку - т.е. компиляция не до конца

Haskell
1
[9,94*Minmodule> *** Exception: E:\Minmodule.hs:(125,1)-(132,98): Non-exhaustive patterns in somefun
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38193 / 21126 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
18.03.2017, 19:36
SKY_SHY, вообще-то все работает:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import System.IO
 
sum3lists [] _ _ = []
sum3lists _ [] _ = []
sum3lists _ _ [] = []
sum3lists (x:xs) (y:ys) (z:zs) = (x+y+z) : sum3lists xs ys zs
 
main = do
       putStrLn "Please, enter the first list"
       l1 <- getLine
       putStrLn "Please, enter the second list"
       l2 <- getLine
       putStrLn "Please, enter the third list"
       l3 <- getLine
       putStrLn $ show $ sum3lists (read l1) (read l2) (read l3)
Миниатюры
Написать функцию попарного сложения элементов двух списков  
0
Модератор
 Аватар для Curry
5158 / 3487 / 536
Регистрация: 01.06.2013
Сообщений: 7,567
Записей в блоге: 9
18.03.2017, 20:05
Цитата Сообщение от SKY_SHY Посмотреть сообщение
Вообще-то, реализация от Catstail выдает ошибку - т.е. компиляция не до конца
Компиляция у вас происходит, ошибка при выполнении, где то в строках 125 - 132 вашего исходного кода, в функции somefun. В фрагменте Catstail-а нет ни такой функции, ни стольки строк. Видимо, вы много примеров в один файл собрали. Сделайте новый исходный файл, перенесите туда только то, что нужно для конкретного примера - ошибку найти будет проще.

Добавлено через 9 минут
SKY_SHY, по сути ошибки легко нагуглите "Non-exhaustive patterns".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2017, 20:05
Помогаю со студенческими работами здесь

Написать традиционную функцию умножения двух чисел, и функцию использующую только операцию сложения
#include &lt;stdio.h&gt; #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;iostream&gt; ...

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

Написать функцию для сложения двух чисел
... без использования &quot;+&quot; и других арифметических операций. P.S. Кто знает, пожалуйста, не пишите ответ сразу, пусть другие тоже...

Написать функцию исключающего сложения двух множеств STL
Вроде написана функция правильно....сравниваем значения по итераторам.....но выводит не то...помогите найти ошибки ...

Написать программу сложения двух чисел, используя рекурсивную функцию
5. Написать программу сложения двух чисел (прибавление единицы) используя рекурсивную функцию.


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru