2016-05-30 3 views
1

Rubyと再帰メソッドを学習しています。私が取り組んでいる問題は、配列内の単語をソートすることです。私の再帰メソッドが正しく配列をソート、しかし、私はメソッドを介して、アレイを実行するたびに、初期の配列(「言葉」)からの最後の言葉は削除されます:再帰を使ってソートすると、配列内の単語が削除/ポップする

# Word sorter 

def sort(some_array) 
    recursive_sort(some_array, []) 
end 

def recursive_sort(unsorted_array, sorted_array) 
    if unsorted_array.length <= 0 
    return sorted_array 
    end 

    smallest = unsorted_array.pop 
    unsorted = [] 
    unsorted_array.each do |word| 
    if word < smallest 
     unsorted << smallest 
     smallest = word 
    else 
     unsorted << word 
    end 
    end 
    sorted_array << smallest 
    recursive_sort(unsorted,sorted_array) 
end 

words = ['hi', 'welcome', 'bye', 'idk', 'where', 'apples', 'bananas'] 
sort(words) 
puts "#{words}" 
sort(words) 
puts "#{words}" 
sort(words) 
puts "#{words}" 

これは、「言葉に何が起こるかであります"アレイ:

["hi", "welcome", "bye", "idk", "where", "apples"] 
["hi", "welcome", "bye", "idk", "where"] 
["hi", "welcome", "bye", "idk"] 

どうしたのですか?

答えて

0

オブジェクト(あなたのVAR words)への参照を渡しているとあなたがそれに突然変異操作を実行しているので、これは実際には各時間recursive_sortが呼び出された配列の最後の要素を削除している(pop)が起こっています。この問題を解決するには

、あなたのようなあなたの元の配列を変異させないためにdupを使用したいと思う:

もっと重要な
def sort(some_array) 
    given_array = some_array.dup 
    recursive_sort(given_array, []) 
end 

、あなたはメソッド呼び出しを含める必要があなたの関数の出力を印刷します:

words = ['hi', 'welcome', 'bye', 'idk', 'where', 'apples', 'bananas'] 
puts "#{sort(words)}" 
puts "#{sort(words)}" 
puts "#{sort(words)}" 
puts "#{sort(words)}" 

=> 
["apples", "bananas", "bye", "hi", "idk", "welcome", "where"] 
["apples", "bananas", "bye", "hi", "idk", "welcome", "where"] 
["apples", "bananas", "bye", "hi", "idk", "welcome", "where"] 
["apples", "bananas", "bye", "hi", "idk", "welcome", "where"] 
+0

私はpersonnally追加します! 'recursive_sort'を使用して、副作用があることをユーザーに通知します。 – floum

+0

私は今、答えをありがとう! – ckdub

0

問題がArray#popへの呼び出しから来ている:それは配列の最後の要素を返し、副作用として、それを削除します。

未分類配列を複製し、そのようなことが起こらないように複製を使用します。

デフソート(some_array) recursive_sort(some_array、[]) 終了

def recursive_sort(unsorted_array, sorted_array) 
    return sorted_array if unsorted_array.empty? 

    source = unsorted_array.dup 

    current_word = source.pop 
    unsorted = [] 

    source.each do |word| 
    if word < current_word 
     unsorted << current_word 
     current_word = word 
    else 
     unsorted << word 
    end 
    end 

    sorted_array << current_word 
    recursive_sort(unsorted, sorted_array) 
end 
関連する問題