2016-03-04 92 views
1

我試圖在Ruby中構建排序方法來對數組進行排序。這是本書的一個示例練習。 程序將查看原始數組中的每個元素,並確定它們的最低值。Ruby:`each':堆棧級別太深(SystemStackError)排序數組算法

然後將該值添加到新創建的名爲「sorted」的數組中,並從原始數組中刪除該數字。

我們現在有原始數組丟失1個元素和新數組有1個元素。我們用這些調整過的陣列重複上述步驟,直到原來的陣列變空。

不過,我已經得到了我不明白髮生了什麼錯誤:

Blockquote./sorting_argorith.rb:9:in`每個':堆棧層次過深(SystemStackError)

這是我的代碼:

array = [6,4,8,3,2,4,6,7,9,0,1,8,5] 

def sorta array   #method wrapper 
    really_sort array, [] 
end 

def really_sort array, sorted #main method 
    a = array[0]    # set a = the first element 
    array.each do |i| 
    if a > i 
     a = i     #check each element, if anything small than a, 
    end      # set a to that value 
    end 

    sorted.push a   #we've got the smallest element as a, 
    array.delete a  #it is then moved from the old to the new array 

    if array == [] 
    break 
    end 
    really_sort array, sorted  #keep going with my two modified arrays 
end        # till the original is empty (completely moved) 

sorta array   #call the wraped method 

puts 
print array 
print sorted 

回答

1

使用return sorted代替break因爲你是裏面的方法不內環

所以用這個

array = [6,4,8,3,2,4,6,7,9,0,1,8,5] 

def sorta(array)   #method wrapper 
    really_sort(array, []) 
end 

def really_sort(array, sorted) #main method 
    a = array[0]    # set a = the first element 
    array.each do |i| 
    if a > i 
     a = i     #check each element, if anything small than a, 
    end      # set a to that value 
    end 

    sorted.push(a)   #we've got the smallest element as a, 
    array.delete(a)  #it is then moved from the old to the new array 

    if array == [] 
    return sorted 
    end 
    really_sort(array, sorted)  #keep going with my two modified arrays 
end 

sorted = sorta(array) 
p sorted 
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

BTW:而不是更好地利用array.empty?array == []

+0

如果您願意,請仔細關注拼寫。啓用拼寫檢查器也有幫助:) –

+0

嗨,我編輯了我的問題與您給我的問題,因爲我從編輯器複製舊代碼。現在是'返回排序'。我的兩個陣列現在都是空的:( –

+0

@LoganNguyen:不要那麼做(用代碼來回答你的問題代碼)你現在有另外一個錯誤了,提出另一個問題(當然你自己弄清楚了) –

0

有可能提出的方案(S)的一個問題 - 數組#刪除方法將刪除所有您提供的對象作爲參數出現。考慮循環的第一次迭代;當您調用array.delete(a)的值爲6時,它將從原始數組中刪除兩個六個(索引0,6)。

以下是保留所有原始元素的替代方法。

array = [6,4,8,3,2,4,6,7,9,0,1,8,5] 
sorted = [] 
until array.empty? 
    min = array.min 
    idx = array.index(min) 
    sorted.push(array.delete_at(idx)) 
end 

陣列#分鐘將來自陣列返回最小的值

陣列#索引將返回第一發生對象的索引

陣列#delete_at將刪除對象在指定的索引(並返回它)

相關問題