2016-05-30 62 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}" 

这是发生了什么“的话“array:

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

为什么会发生这种情况?

回答

0

发生这种情况,因为你传递一个参考的对象(你VAR words)和你在它(pop)执行变异操作,这是每次recursive_sort实际删除数组的最后一个元素被称为。

要解决这个问题,你要为了使用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