2015-07-07 2 views
4

Я написал следующую функцию, чтобы найти данный элемент «x» в данном списке «lst» и вернуть его индекс, если он найден, иначе он вернет ошибка:Поиск элемента в списке и возврат его индекса - OCaml

exception Failure of string 

let rec func x lst c = match lst with 
    | [] -> raise(Failure "Not Found") 
    | hd::tl -> if (hd=x) then c else func x tl (c+1) 


let find x lst = func x lst 0 

Функция полностью работает, мне просто интересно, что это за потребление памяти? Значит ли потребление памяти зависит от длины списка? или это O (1)?

Если это не O (1), кто-то, пожалуйста, сообщите мне, что я должен сделать, чтобы сделать это так?

Спасибо

+0

Кстати, OCaml имеет конструктор исключений 'Not_found' только для такого рода вещей. – gsg

ответ

4

Вашей функции потребляет постоянное (O (1)) пространство, потому что хвостовая рекурсия.

Вы можете прочитать о рекурсии хвоста на OCaml.org, here.

Update

Здесь не является хвостовой рекурсией решение:

exception Failure of string 

let rec find x lst = 
    match lst with 
    | [] -> raise (Failure "Not Found") 
    | h :: t -> if x = h then 0 else 1 + find x t 

(я только что заметил, что PatJ уже объяснил это, извините :-)

Часто не- хвостовое рекурсивное решение более кратким и элегантным. Это слишком плохо, но иногда так бывает в мире.

+1

Спасибо :) Просто из любопытства, что бы была функция, выполняющая ту же работу, что и я, но все же потребляет O (n) пространство? Мне не нужно отвечать на это, но я действительно хотел бы знать, так как я не могу придумать, как это сделать, даже после прочтения ссылки, которую вы мне отправили – Kyle

+2

Если рекурсивный вызов функции не был «последним действием «сделано до возвращения, тогда это будет O (n). Например, если вместо переменной счетчика 'c' вы бы имели if if (hd = x), то 0 else 1+ (find x tl)', то каждый рекурсивный вызов добавлял бы некоторые переменные в стек. – PatJ

+0

Спасибо вам всем! Это смешно, потому что вчера вечером я, вероятно, написал ту же самую точную функцию, которую вы оба предложили, но почему-то это просто не сработало. Иногда OCamlWin просто так глючит. – Kyle

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