Ocaml, как суммировать отдельные элементы с хвостовой рекурсией? - PullRequest
0 голосов
/ 27 ноября 2018

Все просто, я думаю, проблема в следующем: при заданном списке int, как пример [25; 30; 45; 60], вернуть список int со значениями [25; 30 + 25; 45 + 30 + 25; 60+ 45 + 30 + 25].

У меня есть 2 версии кода (никто не работает).

let accu_weather lst =
    let rec aux acc lst2 = function 
        | [] -> []
        | h::t -> aux((acc+h) lst2::(h+acc)) lst
    in 0 []

let accu_weather lst =

    let rec accu lst2 = function
        | [] -> []
        | [x] -> x
        | h::t -> (h+accu(t))::lst2

    in accu List.rev(lst)

Кто-то знает решение, и что я делаю неправильно ??Спасибо !!

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Попробуйте это:

let rec accu list = 
    match list with 
    |[] -> [] 
    |l::[] -> [l] 
    |l::l1::r -> l::accu ((l1+l)::r);;
0 голосов
/ 27 ноября 2018

Вы написали,

let accu_weather lst =
    let rec aux acc lst2 = function 
        | [] -> []
        | h::t -> aux((acc+h) lst2::(h+acc)) lst
    in 0 []

Сначала, здесь

in 0 []

Вы применяете 0 к пустому списку.Это не имеет смысла.Там вы должны сделать некоторый вызов вашей вспомогательной функции с правильными аргументами.

И здесь

| h::t -> aux((acc+h) lst2::(h+acc)) lst

Вы применяете aux к ((acc+h) lst2::(h+acc)) и lst.Какой тип вашего первого аргумента?и что такое lst?

Я бы посоветовал вам сначала начать с более простого упражнения.Например, просто вычислить сумму элементов списка (используя аккумулятор).

...