سؤال

كيفية الحصول على قيمة العنصر الأخير من القائمة؟ لقد لاحظت أن القائمة .hd (أو .HEAD) إرجاع عنصر، في حين إرجاع القائمة. TL (أو .tail) قائمة.

هو Rev القائمة والحصول على HD الطريقة الوحيدة حولها؟ شكرًا.

هل كانت مفيدة؟

المحلول

جرب هذه الوظيفة. يستخدم الإصابة، على الرغم من أنه يحصل على تحسين التكرار على أي حال لأنها متصاعدة الذيل. في أي حال، من المرجح أن تكون أسرع من عكس القائمة بأكملها (باستخدام List.rev).

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

ومع ذلك، فإن إجابة بافيل مينيف يستحق المراعاة بالتأكيد في الاعتبار. ومع ذلك، قد تكون الخوارزمية التي طلبتها قد تكون مفيدة في بعض الحالات النادرة، وهي الطريقة الأكثر كفاءة للذهاب في المهمة.

نصائح أخرى

بشكل عام، إذا كنت بحاجة إلى القيام بذلك، فأنت تفعل شيئا خاطئا. منذ قوائم F # مرتبطة واحدة، الوصول إلى العنصر الأخير مكلفة - O(N), ، حيث ن هو حجم list. وبعد حاول إعادة كتابة خوارزمية الخاص بك بحيث يمكنك دائما الوصول إلى أول العنصر، وليس الأخير (وهو O(1)). إذا لم تتمكن من القيام بذلك، فمن الجيد أن تختاره list للحصول على هيكل البيانات غير صحيح في المقام الأول.

طريقة سريعة وقذرة للقيام بذلك هي باستخدام القائمة. على افتراض أن القائمة يسمى ls,

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

أما بالنسبة للكفاءة، وأنا أتفق مع بافل.

نسخة أكثر عرضا على أساس إجابة ميتش:

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

ال myList يتم إرسال القائمة إلى List.rev وظيفة. ثم تتم معالجة النتيجة من قبل List.head

متفق عليه، وليس فعالا للحصول على العنصر الأخير من list, ، أو أي تسلسل "غير قابل عام" آخر. ومع ذلك، هذه الوظيفة موجودة بالفعل في Seq وحدة، Seq.last.

كمطور مبتدئ، لا أرى ما هو الضرر في القيام بما يلي

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]

يمكنك استدعاء قائمة. رأس للحصول على العنصر الأول من القائمة، بحيث يقيم التعبير أدناه إلى True:

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

ومع ذلك، ستعود قائمة الاتصال. إرجاع كل عنصر في القائمة بعد العنصر الأول، بحيث يكون التعبير أدناه صحيحا:

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

عمل أدناه رمز يعمل بشكل جيد معي، لدي مجموعة من الأعداد الصحيحة، ترغب في البدء من العنصر الخامس، ثم أعتبر ناقص رقم العنصر

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top