2011-05-24 49 views
3

我是F#的新手,試圖找出一些基本知識,但是很慢。在下面的代碼中,我試圖生成一個隨機整數列表,然後對其進行排序。隨機整數列表上的F#選擇排序

let randomNumberList count = 
    let r = System.Random() 
    List.init count (fun _ -> r.Next(100)) 

let rec selectionSort l = function 
    | [] -> [] 
    | l -> let min = List.min l in 
      let rest = List.filter (fun i -> i <> min) l in 
      let sortedList = selectionSort rest in 
      min :: sortedList 
sortedList = selectionSort l 

let unsortedList = randomNumberList 10 
printfn "%A" unsortedList 
printfn "%A" sortedList 

所以兩件事......一個是我收到的錯誤:

stdin(515,19): error FS0001: This expression was expected to have type 
    'a list  
but here has type 
    'a list -> 'a list 

另一種是用隨機數表。它可以工作,但我希望生成的數字少於100,而不是我現在得到的巨大數值。

感謝您的耐心和幫助!

+0

genRandomNumbers縮寫形式是不宣而當你調用它。你的複製/粘貼中有東西丟失了嗎?此外,「let rec selectoinSort l = function | [] ...」也被破壞。 – 2011-05-24 06:51:52

+0

耶genRandomNumbers是一個錯字。你能告訴我如何修復selectionSort函數嗎? – Danny 2011-05-24 07:00:30

回答

1

正如在評論中提到的那樣,l不需要let rec selectionSort。固定碼:

let randomNumberList count = 
    let r = System.Random() 
    List.init count (fun _ -> r.Next(100)) 

let rec selectionSort = function 
    | [] -> [] 
    | l -> let min = List.min l in 
      let rest = List.filter (fun i -> i <> min) l in 
      let sortedList = selectionSort rest in 
      min :: sortedList 

let unsortedList = randomNumberList 10 
let sortedList = selectionSort unsortedList 
printfn "%A" unsortedList 
printfn "%A" sortedList 
System.Console.ReadLine() |> ignore 

說明:

let vname = function 
    | ... -> ... 
    | ... -> ... 

let vname arg = match arg with 
    | ... -> ... 
    | ... -> ... 
+0

這不會是任何方式的尾遞歸:)。你在函數中做的最後一件事情是調用(:),而不是selectionSort。看看生成的IL。 – Alex 2011-05-24 07:39:12

+0

@Alex你是對的。 – khachik 2011-05-24 08:59:45