Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Svetlanana11
1 / 1 / 1
Регистрация: 11.06.2015
Сообщений: 37
1

Арифметическая прогрессия

15.03.2019, 21:41. Просмотров 1112. Ответов 8
Метки нет (Все метки)

Всем добрый день! Помогите, пожалуйста, написать программу, которая вычисляет сумму первых n членов арифметической прогрессии. Задачка простая, но я только начала изучать функциональное программирование и не все еще понимаю.
Вот что получилось у меня, но выдает ошибки.
Haskell
1
2
3
4
5
6
7
sumArithmetic :: Integer -> Integer -> Integer -> Integer
--a - первый член последовательности, d - разность, n - количество первых членов последовательности
sumArithmetic a d n | (n == 1) = a
sumArithmetic a d n | (n == 0) = 0
                              | otherwise = a + (sum (a+d) d (n-1))
main :: IO ()
main =  do print(sumArithmetic 1 2 10)
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2019, 21:41
Ответы с готовыми решениями:

Арифметическая прогрессия
Сумма первых 15 членов арифметической последовательности равна 225,а второй ее член равен 3....

Арифметическая прогрессия
Вывести на экран 7ой член прогрессии если числа находящиеся по соседству различаются в 5 раз, а...

Арифметическая прогрессия
Дана арифметическая прогрессия с первым членом 0.4 и разностью -0.5 . Записать программу...

Арифметическая прогрессия
1.Дана арифметическая прогрессия с первым членом 0.3 и разностью 0.2. Записать программу...

Арифметическая прогрессия
народ помогите отпишитесь кто знает как работает программа??? #include <iostream> #include...

8
Curry
2952 / 2021 / 252
Регистрация: 01.06.2013
Сообщений: 4,414
Записей в блоге: 8
15.03.2019, 22:17 2
Лучший ответ Сообщение было отмечено Svetlanana11 как решение

Решение

С явной рекурсией
Haskell
1
2
3
sumArithmetic a d = go 0 a
    where go r x n | n <= 0 = r
                   | otherwise = go (r+x) (x+d) (n-1)
Счёт по формуле суммы арифметической прогрессии
Haskell
1
sumArithmetic a d n = (2*a+d*(n-1)) `div` 2 * n
Добавлено через 18 минут
В функциональном стиле
Haskell
1
2
3
4
5
import Data.List
 
sumArithmetic :: Integer -> Integer -> Integer -> Integer
--a - первый член последовательности, d - разность, n - количество первых членов последовательности
sumArithmetic a d n = sum $ genericTake n [a,a+d..]
4
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
16.03.2019, 10:23 3
Haskell
1
2
3
4
5
sumArithmetic a d n = go a d n 0 
  where
    go a d n res 
      | n > 0 = go (res + a) d (n - 1) (res + a)
      | otherwise = res
Добавлено через 3 минуты
Цитата Сообщение от Curry Посмотреть сообщение
sumArithmetic a d = go 0 a
* * where go r x n | n <= 0 = r
* * * * * * * * * *| otherwise = go (r+x) (x+d) (n-1)
Проверила с вашей, результат не совпадает, пошла проверять

Добавлено через 8 минут
Извиняюсь, d - разность, я приняла это как член суммы последовательности.
Задание должно быть "вычисление члена арифметической прогрессии"

Добавлено через 5 минут
Пристрелите меня!
Все правильно, я долго соображаю

Добавлено через 7 минут
Цитата Сообщение от nezabudka Посмотреть сообщение
n > 0 = go (res + a) d (n - 1) (res + a)
Я даже в своем примере умудрилась сделать ошибку
Haskell
1
    | n > 0 = go (res + d) d (n - 1) (res + a)
Добавлено через 10 минут
Haskell
1
2
3
4
5
6
sumArithmetic'' :: Integer -> Integer -> Integer -> Integer
sumArithmetic'' a d n = go a d n 0
  where
    go a d n res
      | n > 0 = go (a + d * (n - 1)) d (n - 1) (res + a)
      | otherwise = res
Добавлено через 18 минут
Пробую сделать вот так.
Haskell
1
sumArithmetic''' a d n = sum [ a + d * y | y <- [1..n] ]
Выдает разные с предыдущей функцией результаты. Не пойму в чем дело
2
Catstail
Модератор
24605 / 12513 / 2284
Регистрация: 12.02.2012
Сообщений: 20,332
16.03.2019, 10:45 4
Цитата Сообщение от nezabudka Посмотреть сообщение
Выдает разные с предыдущей функцией результаты. Не пойму в чем дело
- не в том ли, что во втором случае пропущен самый первый член прогрессии?
2
16.03.2019, 10:45
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
16.03.2019, 11:04 5
Все таки первая функция работает правильно а последняя должна быть такой
Haskell
1
sumArithmetic''' a d n = sum [ a + d * y | y <- [1..n-1] ] + a
Благодарю всех за терпение

Добавлено через 10 минут
Ладно, последний коммит, продакшн
Haskell
1
sumArithmetic''' a d n = sum [ a + d * y | y <- [0..n-1] ]
1
Catstail
Модератор
24605 / 12513 / 2284
Регистрация: 12.02.2012
Сообщений: 20,332
16.03.2019, 12:11 6
Цитата Сообщение от nezabudka Посмотреть сообщение
последний
???


Haskell
1
2
sumArr :: Integer -> Integer -> Int -> Integer
sumArr d a n = foldr (+)  0  $ take n [a,a+d..]
3
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
16.03.2019, 17:54 7
Catstail. Я могу ошибаться но ваш результат хромает
Haskell
1
sumArr a d n = foldl ((\a d acc n -> acc + d * n + a) a d) 0 [0..n-1]
Добавлено через 9 минут
Думаю все дело в этом
Цитата Сообщение от nezabudka Посмотреть сообщение
Извиняюсь, d - разность, я приняла это как член суммы последовательности.
Задание должно быть "вычисление члена арифметической прогрессии"
Добавлено через 1 час 14 минут
Мне надо отдохнуть
1
Catstail
Модератор
24605 / 12513 / 2284
Регистрация: 12.02.2012
Сообщений: 20,332
16.03.2019, 19:59 8
nezabudka, у меня первый параметр - d (разность). Но код правильный:

Haskell
1
2
3
4
5
6
7
8
*Main> sumArr 1 1 10
55
*Main> sum [1..10]
55
*Main> sumArr 2 1 10
100
*Main> sum [1,3,5,7,9,11,13,15,17,19]
100
1
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
16.03.2019, 21:08 9
Catstail, Извиняюсь, у вас аргументы функции идут в другой последовательности.
А то я уже начала сомневаться в реальности происходящего )))
2
16.03.2019, 21:08
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2019, 21:08

Арифметическая прогрессия
найти сумму членов арифметической прогрессии а, а+d,..., a+(n-1)d по данным значения a, d, n.

арифметическая прогрессия
задана арифметическая прогрессия. известны первые 2 элемента-они отрицательны(-302, -288). сколько...

Арифметическая прогрессия
Вычислить (1+1/1^2)+(1+1/2^2)+(1+1/3^2)+...+(1+1/100^2). Найдите ошибку: #include &lt;iostream&gt;...


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

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

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