【发布时间】:2014-11-06 00:54:35
【问题描述】:
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)
以上是我对练习面试问题的解答。但是,输出始终是一个空数组 ([])。我的问题似乎很简单,因为我只需要返回最终结果数组,所以我必须遗漏一些明显的东西。基本上,我无法弄清楚为什么它会打印一个空数组,因为我觉得逻辑是合理的。
更新:
下面是我的解决方案的更新版本,其中我将方法包装在一个类中并将结果作为实例变量,以便我可以在整个递归调用过程中保持其状态。感谢@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)
【问题讨论】:
-
解决方案是否应该是递归的?
-
面试题是什么?
-
@seph 据我了解,问题要求他检查数组
my_arry中两个数字的总和是否等于my_sum。如果两个数的和相等,则返回这两个数 -
递归函数的主要问题是结果存储在每个函数调用的本地,因此基本上每次递归调用都会清除结果。
-
@seph 面试问题是:给定一个数字数组和一个目标总和,编写一个函数,返回一个包含所有潜在数字对的新数组。