2017-08-27 15 views
0

私は、Rubyで再帰的なマージソートアルゴリズムを書くことを割り当てています。私はそれを周りに私の頭を包むことができるようにするためにピースでこれを分解しようとしています。私がこれまで行ってきたことは、各配列に1つの要素しか残されなくなるまで「分割」のステップを達成しようとしていることです。Rubyマージソート - この再帰関数はどのように機能しますか?

a = [5, 2, 4, 6, 1, 7, 3, 8] 

def divide(arr) 
    return arr if arr.length < 2 
    else 
     arr1 = puts divide(arr[0..arr.length/2-1]) 
     arr2 = puts divide(arr[arr.length/2..arr.length]) 
end 

私は、出力はと思うだろう:

[5] [8] 

しかし、それは出て印刷します。

5 
2 

4 
6 

1 
7 

3 
8 

それが動作しない方法は?

+0

男、私はとても混乱していますが、処分した

は、私はそれが助けていただければ幸いです、あなたのコードがどのように機能するかを示すために、いくつかのプリントを追加しましたそれはちょうど[8]を返す。 –

答えて

3

少なくとも2つの問題があります。

最初に、elseステートメントは効果がありません。ルビーではif elseとは異なります。

a.length < 2falseの場合、メソッドはnilを返します。 putsnil、はnilを返します。

$level = 0 

def divide(arr) 
    return arr if arr.length < 2 

    $level += 1 

    puts "Working with array #{arr}" 

    arr1 = divide(arr[0..arr.length/2-1]) 
    puts "Level = #{$level} arr1 = #{arr1}" 
    arr2 = divide(arr[arr.length/2..arr.length]) 
    puts "Level = #{$level} arr2 = #{arr2}" 

    $level -= 1 

    nil 
end 

divide([5, 2, 4, 6, 1, 7, 3, 8]) 

出力:

Working with array [5, 2, 4, 6, 1, 7, 3, 8] 
Working with array [5, 2, 4, 6] 
Working with array [5, 2] 
Level = 3 arr1 = [5] 
Level = 3 arr2 = [2] 
Level = 3 arr1 = 
Working with array [4, 6] 
Level = 4 arr1 = [4] 
Level = 4 arr2 = [6] 
Level = 4 arr2 = 
Level = 4 arr1 = 
Working with array [1, 7, 3, 8] 
Working with array [1, 7] 
Level = 6 arr1 = [1] 
Level = 6 arr2 = [7] 
Level = 6 arr1 = 
Working with array [3, 8] 
Level = 7 arr1 = [3] 
Level = 7 arr2 = [8] 
Level = 7 arr2 = 
Level = 7 arr2 = 
+0

今すぐウサギの穴で迷子になった。私はこれまで私の人生で何かでこれまで苦労したことはありません。私が見ているのは、arr1を分割することができなくなるまで、そしてarr2が私が望んでいたように最後の4つの数字で作業を終わらせないようにすることだけです。数字が消えているだけでなく、マージソートがどのように動作するはずでもありません。これは私の死になるだろう。 –

+1

「else」が役に立たない理由(なぜなら、暗黙の 'rescue'ブロックの' else'と解釈されています)を説明するのに役立つでしょう。ところで、@ JacobMoore:あなたは警告を読む習慣に入るべきです。あなたのコードは次のような警告を生成します。「警告:救助なしのものは役に立たない」というのはDanilの話です。 –

関連する問題