1

アルゴリズムとF#の並べ替えについて詳しく学習しようとしているときに、F#で挿入並べ替えを作成しました。私はF#と関数型プログラミングの完全な初心者です。

let insert (a: array<int>) i item =
    i = i - 1
    while i >= 0 && item < a.[i] do
        a.[i + 1] = a.[i]
        i = i - 1
    a.[i + 1] = item
    a

let sort (a: array<int>) =
    for i in 1 .. (a.Length - 1) do
        a = insert a i a.[i]
    a
let a = [|3; 4; 1; 3;|]
a = sort a
for i in a do
    printfn "%d" i

コードは正常にコンパイルされますが、実行可能ファイルを実行すると...

Unhandled Exception: System.IndexOutOfRangeException: Index was outside the boun
ds of the array.
   at Isort.insert(Int32[] a, Int32 i, Int32 item)
   at Isort.sort(Int32[] a)
   at <StartupCode$isort>.$Isort.main@()

範囲外の例外がどこにあったかがわからないので、例外はちょっと役に立たないです...私のコードでこのエラーを修正する方法はありますか?

4

1 に答える 1

4

いくつかのコメント:

  • F#値は、デフォルトでは不変です。値を変更する場合は、として宣言しますmutable
  • =は等式であり、<-は可変値への割り当てです。
  • F#の警告に注意してください。この場合、比較の値を無視するため、多くのエラーが発生します。

改善されたバージョン:

let insert (a: int []) j item =
    let mutable i = j - 1
    while i >= 0 && item < a.[i] do
        a.[i + 1] <- a.[i]
        i <- i - 1
    a.[i + 1] <- item

let sort (b: int []) =
    let a = Array.copy b
    for i in 1 .. (a.Length - 1) do
        insert a i a.[i]
    a
let a = [|3; 4; 1; 3; 5; 6; 5|]
let a' = sort a
for i in a' do printfn "%d" i

わかりやすくするために、いくつかの変数の名前を変更しました。さらに、補助関数は、入力配列を変更する代わりに新しいコピーを返す方がよい一方で、insert戻ることができます。unitsort

于 2012-08-15T18:18:56.573 に答える