Если вы не хотите обновляться до последней версии. Выполните эту команду:
npm install npm@4.2.0 -g
Замените 4.2.0 любой версией, которую вы хотите. Вот все версии выпуска до 3 октября 2017 года: https://nodejs.org/en/download/releases/
Попробуйте эту функцию. Он использует рекурсию, хотя он все равно оптимизируется для итераций, поскольку это хвостовая рекурсия. В любом случае, это, скорее всего, быстрее, чем перевернуть весь список (используя List.rev
).
let rec last = function
| hd :: [] -> hd
| hd :: tl -> last tl
| _ -> failwith "Empty list."
Однако ответ Павла Минаева определенно стоит принять во внимание. Тем не менее, запрошенный вами алгоритм может быть полезен в некоторых редких случаях и является наиболее эффективным способом решения задачи.
В общем, если вам нужно это сделать, вы что-то делаете неправильно. Поскольку списки F # являются односвязными, доступ к последнему элементу является дорогостоящим - O (N)
, где N - это размер списка
. Попробуйте переписать свой алгоритм таким образом, чтобы вы всегда обращались к первому элементу , а не к последнему (который равен O (1)
). Если вы не можете этого сделать, велика вероятность, что ваш выбор list
для структуры данных изначально был неправильным.
Обычный способ работы со списками в F # - использовать рекурсию. Первый элемент в списке - это голова (очевидно), а остальная часть списка - это хвост (в отличие от последнего элемента). Поэтому, когда функция получает список, она обрабатывает заголовок , а затем рекурсивно обрабатывает остальную часть списка (хвост ).
let reversedList = List.rev originalList
let tailItem = List.hd reversedList