リストの最後の要素の値を取得する方法は?List.hd(または.Head)はアイテムを返し、List.tl(または.Tail)はリストを返すことに注意しました。
リストを回転させてHDを取得するのが唯一の方法ですか?ありがとう。
この機能を試してください。末尾再帰であるため、とにかく反復に最適化されますが、再帰を使用します。いずれにせよ、(を使用して)リスト全体を逆にするよりも速い可能性がありますList.rev
。
let rec last = function
| hd :: [] -> hd
| hd :: tl -> last tl
| _ -> failwith "Empty list."
ただし、PavelMinaevの答えは間違いなく考慮する価値があります。それでも、要求したアルゴリズムはまれに役立つ場合があり、タスクを実行するための最も効率的な方法です。
一般に、これを行う必要がある場合は、何か間違ったことをしています。F#リストは単一リンクであるため、最後の要素へのアクセスにはコストがかかります- O(N)
、ここで、Nはのサイズですlist
。最後の要素()ではなく、常に最初のO(1)
要素にアクセスするように、アルゴリズムを書き直してみてください。それができない場合はlist
、そもそもデータ構造の選択が正しくなかった可能性があります。
それを行うための迅速で汚い方法は、List.reduceを使用することです。リストがと呼ばれると仮定するとls
、
let lastElement ls = List.reduce (fun _ i -> i) ls
効率に関しては、私はPavelに同意します。
ミッチの答えに基づくより簡潔なバージョン:
let lastItem = myList |> List.rev |> List.head
myList
リストは関数に送信されますList.rev
。結果は、によって処理されますList.head
list
同意しましたが、の最後の要素、またはその他の「列挙可能な」シーケンスを取得するのはそれほど効率的ではありません。とはいえ、この関数はすでにSeq
モジュールに存在しますSeq.last
。
初心者のF#開発者として、私は次のことを行うことで何が害になるのかわかりません
let mylist = [1;2;3;4;5]
let lastValue = mylist.[mylist.Length - 1]
本質的に必須ですか?はい。ただし、再帰は必要ありません。
F#でリストを操作する通常の方法は、再帰を使用することです。リストの最初の項目は(明らかに)頭であり、リストの残りの部分は(最後の項目とは対照的に)尾です。したがって、関数がリストを受信すると、関数はヘッドを処理してから、リストの残りの部分(テール)を再帰的に処理します。
let reversedList = List.rev originalList
let tailItem = List.hd reversedList
私はあなたがただ書くことができると思います
list.[0..list.Length-1]
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
以下のコードは私とうまく機能しました、私は整数の配列を持っています、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
これは非常に古い質問ですが、誰かがここに来た場合に備えて:
FSharp 5を使用すると、x。[^ index]を実行できます。ここで、インデックスは配列/リストの最後から始まります。
let a = [1;2;3;4;5;6;7;8;9]
a.[^0] is 9
a.[^1] is 8
etc