2015-02-17 4 views

ответ

2

минусы :: оператора принимает элемент в виде левостороннего аргумента и список в качестве правого аргумента. Здесь вы делаете противоположное, что не работает.

Правильный способ добавить элемент в элемент в конце списка, чтобы использовать список конкатенации:

let rec reverse l = 
    match l with 
    | [] -> [] 
    | h :: t -> (reverse t) @ [h] 

Этот код не является оптимальным, хотя, и вы можете сделать его tail recursive.

+0

Как можно было бы сделать эту функцию хвостом рекурсивным? Я пока не понимаю концепцию хвостовой рекурсии, так как я только начал использовать Ocaml – AndroidNewbie

+0

Ну, идея хвостовой рекурсии состоит в том, что рекурсивные вызовы вашей функции всегда будут «последним» действием, выполняемым вашей функцией. говорить на терминах C, ваши вызовы функции всегда в форме 'return myfun()'. Здесь последний вызов вашей функции - '@'. Хвост-рекурсия часто разрешается путем добавления аргумента «аккумулятора» к вашей функции, который сохранит ваш промежуточный результат и будет возвращен вашими терминалами (здесь терминальный случай «[]»). – PatJ

+0

Вы можете найти этот вопрос: http://stackoverflow.com/questions/33923/what-is-tail-recursion – PatJ

 Смежные вопросы

  • Нет связанных вопросов^_^