0
Вот мой оригинальный код.Что не так с этой функцией OCAML?
let rec reverse l =
match l with
| [] -> []
| (h::t) -> (reverse t) :: h
Вот мой оригинальный код.Что не так с этой функцией OCAML?
let rec reverse l =
match l with
| [] -> []
| (h::t) -> (reverse t) :: h
минусы ::
оператора принимает элемент в виде левостороннего аргумента и список в качестве правого аргумента. Здесь вы делаете противоположное, что не работает.
Правильный способ добавить элемент в элемент в конце списка, чтобы использовать список конкатенации:
let rec reverse l =
match l with
| [] -> []
| h :: t -> (reverse t) @ [h]
Этот код не является оптимальным, хотя, и вы можете сделать его tail recursive.
Как можно было бы сделать эту функцию хвостом рекурсивным? Я пока не понимаю концепцию хвостовой рекурсии, так как я только начал использовать Ocaml – AndroidNewbie
Ну, идея хвостовой рекурсии состоит в том, что рекурсивные вызовы вашей функции всегда будут «последним» действием, выполняемым вашей функцией. говорить на терминах C, ваши вызовы функции всегда в форме 'return myfun()'. Здесь последний вызов вашей функции - '@'. Хвост-рекурсия часто разрешается путем добавления аргумента «аккумулятора» к вашей функции, который сохранит ваш промежуточный результат и будет возвращен вашими терминалами (здесь терминальный случай «[]»). – PatJ
Вы можете найти этот вопрос: http://stackoverflow.com/questions/33923/what-is-tail-recursion – PatJ