Добавьте предыдущий элемент для каждого элемента в списке в OCaml

#list #recursion #functional-programming #ocaml #tail-recursion

#Список #рекурсия #функциональное программирование #ocaml #хвостовая рекурсия

Вопрос:

Я хочу сделать что-то вроде этого:

Если у меня есть следующий список:

 [1;2;3;4;5]
  

Я хочу получить этот:

 [1;3;6;10;15] -> result of doing [0 1=1; 1 2=3; 3 3=6; 6 4=10; 10 5=15]
  

У меня есть следующий код, но он не является конечным рекурсивным

 let sumsum l = List.fold_right (fun x t -> x::List.map (( ) x) t) l [];;
  

Я застрял, делая это хвостовой рекурсией, кто-нибудь может мне помочь?

Возможно ли это сделать без использования List.fold_right, List.fold_left и List.map?

Спасибо

Комментарии:

1. Вы ищете scan 🙂

Ответ №1:

 let sumsum l =
  let rec aux a' acc = function
    | []    -> List.rev acc
    | a::tl -> let b=a a' in aux b (b::acc) tl
  in
  aux 0 [] l
;;
  

тест

 # sumsum [1;2;3;4;5];;
- : int list = [1; 3; 6; 10; 15]