2011-09-18 109 views
0

我是Ruby新手,所以不要尖叫我...... 我試圖讓所有元素的子集給出,即使我知道有方法「排列」來做到這一點。問題在於兩個陣列。在循環之前,它打印正確的數組,並在循環內打印不同的數組... P.S. index_需要停止遞歸,因爲陣列不按要求工作遞歸問題

def generate_subsets(elements) 
    generate_subsets2(elements, [], 0) 
end 

def generate_subsets2(left, right, index_) 

    puts "received as left: #{left.inspect}" 
    puts "received as right: #{right.inspect}" 
    return if index_ >= 1 

    left.each_with_index do |element, index| 
     puts "left in loop: #{left.inspect}" 
     copy_left = Array.new(left) 
     copy_right = Array.new(right) 
     copy_left.delete_at(index) 
     copy_right.push(element) 
     puts "#{copy_left.inspect} & #{copy_right.inspect}" 
     generate_subsets2(copy_left, copy_right, index_ + 1) 
    end 
end 

generate_subsets(['a','b','c','d']) 
+0

爲什麼'return if index_> = 1'? –

+0

這只是停止程序。否則它就會過着自己的生活...... – damluar

回答

1

我修改了一下你的代碼(只有日誌輸出)。最重要的是:我顯示嵌套層次(index_)。

def generate_subsets(elements) 
    generate_subsets2(elements, [], 0) 
end 

def log(txt, arr, level) 
    puts "%-20s %-2i %s" % [ txt, level, arr ] 
end 

def generate_subsets2(left, right, index_) 

    log "received as left:", left.inspect, index_ 
    #~ log "received as right:", right.inspect, index_ 
    return if index_ >= 1 

    left.each_with_index do |element, index| 
     log "left in loop:", left.inspect, index_ 
     #~ log "right in loop:", right.inspect, index_ 
     copy_left = Array.new(left) 
     copy_right = Array.new(right) 
     copy_left.delete_at(index) 
     copy_right.push(element) 
     #~ puts "#{copy_left.inspect} & #{copy_right.inspect}" 
     generate_subsets2(copy_left, copy_right, index_ + 1) 
    end 
end 

generate_subsets(['a','b','c','d']) 

結果是

received as left: 0 ["a", "b", "c", "d"] 
left in loop:  0 ["a", "b", "c", "d"] 
received as left: 1 ["b", "c", "d"] 
left in loop:  0 ["a", "b", "c", "d"] 
received as left: 1 ["a", "c", "d"] 
left in loop:  0 ["a", "b", "c", "d"] 
received as left: 1 ["a", "b", "d"] 
left in loop:  0 ["a", "b", "c", "d"] 
received as left: 1 ["a", "b", "c"] 

你看,留在循環是一樣的同一嵌套級別收到。沒有嵌套級別,你有印象,剩下的就在變化。好吧,它改變了,但這是另一個電話。

+0

謝謝!愚蠢的錯誤) – damluar