Подтвердить что ты не робот

Значение последнего элемента списка

как получить значение последнего элемента списка? Я заметил, что List.hd(или .Head) возвращает элемент, а List.tl(или .Tail) возвращает список.

Передает список и получает hd единственный путь? Спасибо.

4b9b3361

Ответ 1

Попробуйте эту функцию. Он использует рекурсию, хотя в любом случае оптимизирует ее на итерации с момента ее рекурсии. В любом случае это, скорее всего, быстрее, чем вспять весь список (используя List.rev).

let rec last = function
    | hd :: [] -> hd
    | hd :: tl -> last tl
    | _ -> failwith "Empty list."

Однако ответ Павла Минаева, безусловно, стоит принять во внимание. Тем не менее, запрошенный алгоритм может быть полезен в некоторых редких случаях и является наиболее эффективным способом решения этой задачи.

Ответ 2

В общем, если вам нужно это сделать, вы делаете что-то неправильно. Поскольку списки F # являются односвязными, доступ к последнему элементу является дорогостоящим - O(N), где N - размер list. Попробуйте переписать свой алгоритм так, чтобы вы всегда получали доступ к первому элементу, а не последнему (это O(1)). Если вы не можете этого сделать, есть вероятность, что ваш выбор list для структуры данных был неправильным в первую очередь.

Ответ 3

Быстрый и грязный способ сделать это с помощью List.reduce. Предполагая, что список называется ls,

let lastElement ls = List.reduce (fun _ i -> i) ls

Что касается эффективности, я согласен с Павлом.

Ответ 4

Более краткий вариант, основанный на ответе Митча:

let lastItem = myList |> List.rev |> List.head

Список myList отправляется в функцию List.rev. Затем результат обрабатывается List.head

Ответ 5

Согласовано, не так эффективно получить последний элемент list или любую другую "перечислимую" последовательность. Тем не менее, эта функция уже существует в модуле Seq, Seq.last.

Ответ 6

Как начинающий разработчик F #, я не вижу вреда при выполнении следующих

let mylist = [1;2;3;4;5]

let lastValue = mylist.[mylist.Length - 1]

Императивный характер? Да, но нет необходимости в рекурсии.

Ответ 7

Обычный способ работы со списками в F # - использовать рекурсию. Первым элементом в списке является голова (очевидно), а остальная часть списка - хвост (в отличие от последнего элемента). Поэтому, когда функция получает список, она обрабатывает голову, а затем рекурсивно обрабатывает остальную часть списка (хвост).

let reversedList = List.rev originalList
let tailItem = List.hd reversedList

Ответ 8

Я думаю, вы можете просто написать

list.[0..list.Length-1]

Ответ 9

Вы можете вызвать List.Head, чтобы получить первый элемент списка, так что выражение ниже имеет значение true:

let lst = [1;2;3;4;5]
List.head lst = 1

Однако вызов List.Tail возвращает каждый элемент в списке после первого элемента, так что приведенное ниже выражение истинно:

let lst = [1;2;3;4;5]
List.tail lst = [2;3;4;5]

Как и некоторые другие люди, в F # нет эффективного способа получить хвост списка, базовые списки просто не построены с учетом этой функциональности. Если вы действительно хотите получить последний элемент, вам придется сначала отменить свой список, а затем взять новую голову (это был предыдущий хвост).

let lst = [1;2;3;4;5]
(List.head (List.rev lst) ) = 5

Ответ 10

Ниже код работал отлично со мной, у меня есть массив целых чисел, вы хотите начать с 5-го элемента, затем возьмите его за вычетом номера элемента

Sum of [Array(xi) - Array(xi-5)] where i start at 5

Используемый код:

series |> Array.windowed 5
       |> Array.fold (fun s x -> 
                            (x |> Array.rev |> Array.head) -  (x |> Array.head) + s) 0
       |> float