2015-09-01 1 views
1

Ниже приведен мой код реализации слияния сортировки algo в ruby. После запуска я получаю следующую ошибку. Пожалуйста, помогите мне в разрешении динамической постоянной ошибки.Ошибка динамического постоянного присваивания в Ruby реализации алгоритма сортировки слиянием

Ошибка, которую я получаю в терминале:

ruby merge.rb 
merge.rb:8: dynamic constant assignment 
Li=Array.new(n1.object_id) 
    ^
merge.rb:9: dynamic constant assignment 
Ri=Array.new(n2.object_id) 
     ^

Мой код:

def merge(list,l,m,r) 
    i 
    j 
    k 
    n1 = m - l + 1 
    n2 = r - m 

Li=Array.new(n1) 
Ri=Array.new(n2) 

0.upto(n1-1)do |i| 
    Li[i] = list[l + i] 
end 
0.upto(n2-1)do |j| 
    Ri[j] = list[m + 1+ j] 
end 

i = 0 
j = 0 
k = l 
while i < n1 && j < n2 
    if Li[i] <= Ri[j] 
    list[k] = Li[i] 
    i=i+1 
    else 
    list[k] = Ri[j] 
    j=j+1 
    end 
    k=k+1 
end 

while i < n1 
    list[k] = Li[i] 
    i=i+1 
    k=k+1 
end 

    while j < n2 
    list[k] = Ri[j] 
    j=j+1 
    k=k+1 
    end 
end 

def mergeSort(list,l,r) 
    if (l < r) 
    m = l+(r-l)/2 
    mergeSort(list, l, m) 
    mergeSort(list, m+1, r) 
    merge(list, l, m, r) 
    end 
end 

def printArray(list, size) 
    0.upto(size-1) do |i| 
    puts list[i] 
    end 
end 

list = Array[12, 11, 13, 5, 6, 7] 
puts "Given array is" 
printArray(list,list.size) 

mergeSort(list, 0, list.size - 1) 

puts "Sorted array is" 
printArray(list,list.size) 
+0

Вам не нужно показывать остальную часть кода, так как он не влияет на ошибку. Вы можете продемонстрировать это, написав свой метод только с проблемными строками. См. Http://stackoverflow.com/help/mcve - предпочитайте минимальные примеры для SO. –

ответ

0
Li=Array.new(n1) 
Ri=Array.new(n2) 

Имена начинаются с заглавной буквы являются константами. Ошибка говорит вам, что вы пытаетесь изменить константу. Измените имя Li и Ri так, чтобы они начинались с буквы нижнего регистра.