2014-11-06 46 views
1
def sum_two(arry, sum) 
    p check_sums(sum, arry[0], arry[1..arry.length - 1]) 
end 

def check_sums(target, first_num, remaining_nums) 
    result = [] 
    return result if remaining_nums == [] 

    remaining_nums.each do |n| 
    if first_num + n == target 
     result << [first_num, n] 
    end 
    end 
    check_sums(target, remaining_nums[0], remaining_nums[1..remaining_nums.length - 1]) 
end 

my_arry = [2,4,6,1,3,5,7] 
my_sum = 6 

sum_two(my_arry, my_sum) 

以上是我對面試問題的解答。但是,輸出始終是一個空數組([])。我的問題看似簡單,因爲我只需要返回最終結果數組,所以我必須忽略一些明顯的東西。基本上,我無法弄清楚爲什麼它的打印陣列是空的,因爲我覺得這個邏輯很有把握。發回正確的價值

UPDATE:

下面是我的解決方案的更新版本中,我包裝在類中的方法,使產生一個實例變量,這樣我可以在整個遞歸調用保持其狀態。感謝@BenE提到我每次遞歸調用都要重置值。這真的爲我清除它!這是我的新的解決方案:

class SumTwo 
    @result = [] 

    def self.sum_two(arry, sum) 
    p SumTwo.check_sums(sum, arry[0], arry[1..arry.length - 1]) 
    end 

    def self.check_sums(target, first_num, remaining_nums) 
    return @result if remaining_nums == [] 

    remaining_nums.each do |n| 
     if first_num + n == target 
     @result << [first_num, n] 
     end 
    end 
    check_sums(target, remaining_nums[0], remaining_nums[1..remaining_nums.length - 1]) 
    @result 
    end 
end 
my_arry = [2,4,6,1,3,5,7] 
my_sum = 6 

SumTwo.sum_two(my_arry, my_sum) 
+0

應該是遞歸的解決辦法嗎? – 2014-11-06 01:13:48

+1

面試問題是什麼? – seph 2014-11-06 01:15:01

+0

@seph根據我的理解,問題是要求他檢查數組「my_arry」中的兩個數字的總和是否等於「my_sum」。如果兩個數字相等,那麼他將返回這兩個數字 – 2014-11-06 01:23:11

回答

2

的問題是,你不回的result陣列您在循環,你只能回擊時remaning_nums是空的,這裏是一個可行的解決方案,以你的代碼:

def sum_two(arry, sum) 
    p check_sums(sum, arry[0], arry[1..arry.length - 1],[]) 
end 

def check_sums(target, first_num, remaining_nums,result) 
    return result if remaining_nums == [] 

    remaining_nums.each do |n| 
    if first_num + n == target 
     result << [first_num, n] 
    end 
    end 
    check_sums(target, remaining_nums[0], remaining_nums[1..remaining_nums.length - 1],result) 
    result 
end 

my_arry = [2,4,6,1,3,5,7] 
my_sum = 6 

sum_two(my_arry, my_sum) 
+0

謝謝,但是這個結果只給我一個可能的解決方案,'[[2,4]]'但我想要所有可能的組合,並且我知道'[1,5]'是另一個 – ALLCAPZ 2014-11-07 02:51:52

0

如果你想返回所有對數字的一個數組,其總和爲給定值,我認爲這是最容易使用的方法Array#combination

def sum_two(arry, sum) 
    arry.combination(2).select { |i,j| i+j == sum } 
end 

sum_two [2,4,6,1,3,5,7], 6 
    #=> [[2, 4], [1, 5]] 

sum_two [*(1..24)], 12 
    #=> [[1, 11], [2, 10], [3, 9], [4, 8], [5, 7]] 

sum_two [1,3, 6, 8, 2, 9, 3, 5, 7, 8, 16], 17 
    #=> [[1, 16], [8, 9], [9, 8]] 

如果您想消除[8, 9][9, 8]在最後一個例子,你可以這樣做:

def sum_two(arry, sum) 
    arry.uniq.combination(2).select { |i,j| i+j == sum } 
end 

sum_two [1,3, 6, 8, 2, 9, 3, 5, 7, 8, 16], 17 
    #=> [[1, 16], [8, 9]] 
+0

這是我的方法本來會用Ruby。從最初的問題來看,答案是否需要遞歸解決方案還不清楚;而不使用組合等方法。 – Benji 2014-11-06 02:04:18

+0

謝謝@BenE!這是很好的知道,但我沒有使用內置的ruby方法解決它。遞歸調用只是一種方法,我知道隨着數組的數量增加,您將面臨堆棧溢出的問題。但我一定會將此添加到我可能的解決方案中。 – ALLCAPZ 2014-11-07 02:58:21

+0

「......我在不使用內置Ruby方法的情況下解決它。」嗯。在Ruby中編寫程序而不使用任何內置方法是非常具有挑戰性的。 :-)使用'each'和'combination'有什麼區別? – 2014-11-07 07:16:51