Для [1;2;3]
, я хочу вернуть [[]; [1]; [1; 2]; [1; 2; 3]]
. Я врезался в стену и мне нужна помощь, это то, что я сделал до сих порOCaml - функция, которая возвращает все префиксы списка
let rev list =
let rec aux acc = function
| [] -> acc
| h::t -> aux (h::acc) t in
aux [] list;;
let prefixes xs =
let xs = rev xs in
let rec xs = function
|[] -> [[]]
|hd::tl -> xs:: tl in
xs ;;`
Пожалуйста, помогите мне, я знаю, что, вероятно, большинство из того, что я сделал до сих пор не так.
Можете ли вы ходить меня бросило, что вы сделали, потому что я являюсь действительно новым для OCaml – Thanospan
@Thanospan Я собираюсь предположить, что ваш знакомый со складкой. Если вы не посетите [это] (http://www.cs.cornell.edu/courses/cs3110/2011sp/recitations/rec05.htm). Поэтому внутри List.fold_left itt будет элемент l. Например, в первый раз это будет 1, затем 2, затем 3 ... acc - это то, что вы сейчас имеете, и оно начинается с [[]] пустого списка списка. Так что давайте скажем, что мы находимся в itt = 1, тогда глава acc будет []. Мы констатируем, что голова к itt = 1 должна сделать [1]. acc будет сохранен как [[1]; []] Мы делаем, что новый глава acc. Поэтому, когда fold_left снова повторяет, чтобы itt = 2, головка acc будет [1]. ** next ** –
Снова возьмем голову = [1] и сравним его с [2]. Итак, мы имеем [1; 2] и сохраняем новый acc как [[1; 2]; [1]; []]. Таким образом, вы можете увидеть основную идею. Когда itt = l [n], где l [n] - n-я позиция списка l. Мы хотим, чтобы головка acc была списком с элементами l [0]; l [1]; ..; l [n-1] (содержащий все элементы до, но не включая l [n]). Затем мы объединим эти два, чтобы сделать наш желаемый список содержащим все элементы l [0] равными l [n]. Тогда в основном добавьте это к вершине acc. В конце список фактически отменен, поэтому я вызываю List.rev, чтобы отменить его. Не стесняйтесь спрашивать, запутались ли вы. –