22

リストの最後の要素の値を取得する方法は?List.hd(または.Head)はアイテムを返し、List.tl(または.Tail)はリストを返すことに注意しました。

リストを回転させてHDを取得するのが唯一の方法ですか?ありがとう。

4

11 に答える 11

31

この機能を試してください。末尾再帰であるため、とにかく反復に最適化されますが、再帰を使用します。いずれにせよ、(を使用して)リスト全体を逆にするよりも速い可能性がありますList.rev

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

ただし、PavelMinaevの答えは間違いなく考慮する価値があります。それでも、要求したアルゴリズムはまれに役立つ場合があり、タスクを実行するための最も効率的な方法です。

于 2009-07-23T23:51:44.897 に答える
27

一般に、これを行う必要がある場合は、何か間違ったことをしています。F#リストは単一リンクであるため、最後の要素へのアクセスにはコストがかかります- O(N)、ここで、Nはのサイズですlist。最後の要素()ではなく、常に最初のO(1)要素にアクセスするように、アルゴリズムを書き直してみてください。それができない場合はlist、そもそもデータ構造の選択が正しくなかった可能性があります。

于 2009-07-23T23:48:33.937 に答える
12

それを行うための迅速で汚い方法は、List.reduceを使用することです。リストがと呼ばれると仮定するとls

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

効率に関しては、私はPavelに同意します。

于 2011-05-08T14:26:24.820 に答える
5

ミッチの答えに基づくより簡潔なバージョン:

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

myListリストは関数に送信されますList.rev。結果は、によって処理されますList.head

于 2014-10-29T02:07:39.087 に答える
3

list同意しましたが、の最後の要素、またはその他の「列挙可能な」シーケンスを取得するのはそれほど効率的ではありません。とはいえ、この関数はすでにSeqモジュールに存在しますSeq.last

于 2014-09-18T05:19:21.020 に答える
1

初心者のF#開発者として、私は次のことを行うことで何が害になるのかわかりません

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

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

本質的に必須ですか?はい。ただし、再帰は必要ありません。

于 2014-08-29T04:46:53.350 に答える
0

F#でリストを操作する通常の方法は、再帰を使用することです。リストの最初の項目は(明らかに)頭であり、リストの残りの部分は(最後の項目とは対照的に)尾です。したがって、関数がリストを受信すると、関数はヘッドを処理してから、リストの残りの部分(テール)を再帰的に処理します。

let reversedList = List.rev originalList
let tailItem = List.hd reversedList
于 2009-07-23T23:42:52.263 に答える
0

私はあなたがただ書くことができると思います

list.[0..list.Length-1]
于 2016-10-19T07:29:19.293 に答える
0

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
于 2017-03-07T01:51:50.453 に答える
0

以下のコードは私とうまく機能しました、私は整数の配列を持っています、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
于 2018-01-13T18:52:45.327 に答える
0

これは非常に古い質問ですが、誰かがここに来た場合に備えて:

FSharp 5を使用すると、x。[^ index]を実行できます。ここで、インデックスは配列/リストの最後から始まります。

let a = [1;2;3;4;5;6;7;8;9]

a.[^0] is 9
a.[^1] is 8
etc
于 2021-02-19T23:01:15.837 に答える