2015-11-04 5 views
5

मुझे एक ऐसा प्रोग्राम लिखना है जो आउटपुट में एक ट्यूपल प्रदान करता है: न्यूनतम और अधिकतम रिक्त सूची और अधिकतम मूल्य जो अक्सर दिखाई देता है। विशेष रूप से:न्यूनतम/अधिकतम और सूची का सबसे लगातार तत्व

min_max [1;0;-1;2;0;-4] ==> (-4; 2) 
min_max: int list -> (int * int) 

mode [-1;2;1;2;5;-1;5;5;2] ==> 2 
mode: int list -> int 

इस कोड है कि मैं अधिकतम (न्यूनतम लगभग बराबर है), लेकिन के लिए लिखा है कि कैसे मैं आउटपुट के रूप में दो मूल्यों के साथ एक टपल प्राप्त करने के लिए कर सकते हैं?

let rec max_list xs = 
    match xs with 
    | [] -> failwith "xs" "Empty list" 
    | [x] -> x 
    | x1::x2::xs' -> max_list((max2 x1 x2)::xs');; 
+0

एक साइड नोट के रूप में; आपकी 'max_list' इसके उद्देश्य के लिए थोड़ा जटिल लगता है; वर्तमान सूची के साथ वर्तमान अधिकतम के चारों ओर पास करने के लिए आसान हो सकता है और यदि वर्तमान सिर अधिक हो तो इसे अपडेट कर सकता है। या इसे चारों ओर गुजरने के बिना; केवल वर्तमान सिर और पूंछ – Sehnsucht

उत्तर

2
let minMax xs = 
    xs 
    |> List.fold 
     (fun (mn, mx) i -> min mn i, max mx i) 
     (System.Int32.MaxValue, System.Int32.MinValue) 

विशेष रूप से प्रभावी नहीं है, लेकिन मज़ा लिखने के लिए:

let mode xs = 
    xs 
    |> List.groupBy id 
    |> List.map (fun (i, is) -> i, Seq.length is) 
    |> List.maxBy snd 
    |> fst 
+0

की अधिकतम_सूची के बीच अधिकतम लौटें, मानचित्र के बिना तुरंत अधिकतमबी का उपयोग क्यों न करें? (List.maxBy (मजेदार (_, x) -> Seq.length x)) –

+1

@FoggyFinder कोई विशेष कारण नहीं :) –

+0

क्योंकि मैं प्रोफेसर द्वारा जो समझाया गया है उसके बाहर किसी भी फ़ंक्शन का उपयोग नहीं कर सकता: और यह मेरा है समस्या जब मुझे व्यायाम करना पड़ता है, क्योंकि इस मामले में मैंने तुरंत lis.map, list.fold, seq.fold इत्यादि के बारे में सोचा था। –

3

मैं @Mark Seemann के जवाब से पहला सुझाव लेने के लिए और इसके साथ चलाने के लिए, ताकि इसे सामान्य बनाने के लिए होगा, किसी संग्रह प्रकार के साथ काम करना, और खाली संग्रह के मामले को समझदारी से संभालना।

let tryMinMax xs = 
    Seq.fold (function 
    | Some(mn, mx) -> fun i -> Some(min mn i, max mx i) 
    | None   -> fun i -> Some(i, i)) None xs 

[1;0;-1;2;0;-4] 
|> tryMinMax 
// val it : (int * int) option = Some (-4, 2) 

सबसे लगातार प्रश्न के भाग के लिए: मानक मॉड्यूल के उपयोग के बिना

let mostFrequent xs = 
    xs 
    |> Seq.countBy id 
    |> Seq.maxBy snd 
    |> fst 

[1;0;-1;2;0;-4] 
|> mostFrequent 
// val it : int = 0 
0

विकल्प:

open System 
let tryMinMax xs = 
    let rec minMax xs mn mx = 
     match xs with | [] -> mn, mx | h::t -> minMax t (min mn h) (max mx h) 
    match xs with | [] -> None | _ -> Some(minMax xs Int32.MaxValue Int32.MinValue) 

dotnetfiddle

दूसरा सवाल पर - हल करने के अपने प्रयास दिखाओ।

संबंधित मुद्दे