2017-11-01 3 views
2

マージソートコードを書き込もうとしています。ソートしていなくても印刷します。私は何が間違っていますか?F#のソートコードをソートしないでください

let rec mergePm xs ys = 
    match (xs, ys) with 
    | [], _ -> ys 
    | _,[] -> xs 
    | x::xs, y::ys -> 
     if x < y then x :: mergePm xs (y::ys) 
     else y :: mergePm (x::xs) ys 

let rec msortPm xs = 
    let sz = List.length xs 
    if sz < 2 then xs 
    else 
     let n = sz/2 
     let ys = xs. [0..n-1] 
     let zs = xs.[n..sz-1] 
      in mergePm (msortPm ys) (msortPm zs) 

printfn "%A" (msortPm[1,2,6,5]) 
+0

(もletinは、F#でオプションがどのように注意してください)どうもありがとうございました:)。私はプログラミングに全く新しい –

答えて

4

誤ったリスト構文を使用しています。

[1,2,6,5]と言うときは、4つの要素のリストを作成するのではなく、の要素の1つをというリストにします。その要素は4つの数値のタプルです。

F#のリスト要素は、改行またはセミコロンで区切られています。

これは正常に動作する必要があります:

printfn "%A" (msortPm[1;2;6;5]) 

をさらに、私はList.lengthのように、(F#のリストが不変の単独リンクリストされているので)リストの完全なパスをしていることを指摘したいと思いますアルゴリズムの速度が遅くなります。これは、1つの要素の空のリストと、リスト上のパターンマッチすると良いでしょう:

let rec msortPm xs = match xs with 
    | [] | [_] -> xs 
    | _ -> 
     let n = sz/2 
     let ys = xs. [0..n-1] 
     let zs = xs.[n..sz-1] 
     mergePm (msortPm ys) (msortPm zs) 

は、私が見るああ

関連する問題