Haskell - вычисляет сложную сумму, используя списки - PullRequest
0 голосов
/ 26 марта 2019

для данного списка пользователя s=[x1,x2,...,xk] Мне нужно вычислить сумму

x1 * (x2+x3+...x4)
+ (x1+x2) * (x3+x4+...xk)
+ ...
+ (x1+x2+...+x(k-2)) * (x(k-1) + xk)
+ (x1+x2+...+x(k-1)) * xk

из функции [Int]->Int

См. Математическую формулу на следующей фотографии длялучшее понимание:

https://imgur.com/gallery/Oqgpkcu

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

xsum :: [Int] -> Int
xsum s = sumIntList (init s)

sumIntList :: [Int] -> Int 
sumIntList (h:t) = h + sumIntList t
sumIntList [] = 0

некоторые из результатов, которые ДОЛЖНЫ быть получены вызовомфункция:

xsum [4,5,8]
124

xsum [1..100]
341665830

Спасибо за чтение!

1 Ответ

1 голос
/ 26 марта 2019

На предоставленном вами изображении написано * вместо ^.Было бы хорошо увидеть некоторые из ваших попыток.Один из простых подходов состоит в том, чтобы отобразить функцию splitAt по каждому возможному индексу, затем использовать функцию sum в каждой паре, чтобы получить пару (начальная сумма сегмента, конечная сумма сегмента), а затем для каждой пары умножить ее элементы вместе,затем сложите все полученные продукты.Как далеко вы можете продвинуться с этим кодированием?

РЕДАКТИРОВАТЬ: чтобы уберечь потенциальных будущих читателей от прокрутки всех комментариев, ниже приведена потенциальная реализация, в которой используется только sum.Это неоптимально, потому что это sum с одними и теми же подсписками много раз, лучшая реализация может начаться с использования scanl в обоих направлениях для генерации частичных сумм и продолжения оттуда.

xsum (x:xs@(y:ys)) = x * sum xs + xsum ((x+y):ys)
xsum _ = 0

EDIT2:У нас есть (вроде) движение вперед и назад, мне нравится!

xsum = fst . xsum'
  where xsum' (x:xs@(y:ys)) = (\(acc,s) -> (acc + x * (s-x),s) ) $ xsum' ((x+y):ys)
        xsum' [] = (0,0)
        xsum' [x] = (0,x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...