2014-11-06 45 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