2016-06-23 5 views
0

Я преподавал программирование в течение последних нескольких месяцев, и я, наконец, до рекурсии. Прямо сейчас, я должен реализовать рекурсивно Mergesort. Я сделал свое исследование и понял, что должно произойти, но у меня возникают некоторые проблемы с моим кодом. На данный момент я не хочу просто искать ответ, потому что мне больше интересно выяснить, что я делаю неправильно, а не просто получить ответ. Я получаю сообщение об ошибке не метод, говорящийВнедрение Mergesort в Ruby Рекурсивно

неопределенный метод `>» для [6]: Array

Мой код в данный момент, например:

def merge_sort(arr) 
    n = arr.length 
    p = n/2 
    q = p - 1 
    return arr if n == 1 

    l1 = arr[0..q] 
    l2 = arr[p..n] 

    l1 = merge_sort(l1) 
    l2 = merge_sort(l2) 

    return merge(l1, l2) 
end 

def merge(arr_1, arr_2) 
    arr_3 = [] 
    while !arr_1.empty? && !arr_2.empty? 
    if arr_1[0] > arr_2[0] 
     arr_3 << arr_2[0] 
     arr_2.delete_at(0) 
    else 
     arr_3 << arr_1[0] 
     arr_1.delete_at(0) 
    end 
    end 

    if arr_1.length == 0 
    arr_3 << arr_2[0..-1] 
    elsif arr_2.length == 0 
    arr_3 << arr_1[0..-1] 
    end 

    arr_3 
end 

puts merge_sort([2, 6, 4, 5, 7, 9, 8, 3]) 
+0

Я предполагаю, что ошибка указывает на 'если arr_1 [0]> arr_2 [0]'. Попробуйте использовать gem 'pry' для отладки. В верхней части документа 'require 'pry'', а затем перед этой строкой добавьте' binding.pry' и запустите с терминала. Затем вы сможете напечатать 'arr_1' и' arr_2', чтобы увидеть значения этих переменных. –

+1

Пожалуйста, отформатируйте/выровняйте код с отступом 2-пространства, чтобы сделать его доступным для чтения. Благодарю. – mudasobwa

+0

Спасибо за ваш ответ. Я пробовал что-то подобное, выполняя p arr_1, а также p arr_1 [0] до цикла while, а 6 возвращался как fixnum, а не массив, но я попробую то, что вы предложили! –

ответ

0

Ваш arr_3 содержит массив массивов. Вы должны выровнять его в последней строке merge метода

arr_3.flatten 

Кроме того, я бы рекомендовал использовать имена переменных, которые помогают в понимании методов. Вы также должны посмотреть на различные методы, которые может предложить класс Array, поскольку некоторые из них могут быть полезны при написании краткого кода. Например, ниже приведена одна попытка переписать ваш метод merge, сохраняя логику такой же, как и у вас. Здесь мы избегали arr_3 получение стать массив массива с помощью метода Array#concat

def merge(left, right) 

    merged_array = [] 
    while !left.empty? && !right.empty? 
    if left.first > right.first 
     merged_array << right.shift 
    else 
     merged_array << left.shift 
    end 
    end 

    if left.empty? 
    merged_array.concat right 
    else 
    merged_array.concat left 
    end 

    merged_array 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^