【发布时间】:2016-09-09 20:50:49
【问题描述】:
我正在解决一个问题,即在一个总和为特定目标的数组中找到第一对数字。我必须返回最右边的索引首先出现的对。所以说目标是10,在索引1,5 和[3,7] 索引3,4 上找到的对是[5,5],我必须返回[3,7]。我有递归部分工作,问题是它返回一个哈希,最左边的索引作为键,对作为值。我试图从另一个函数(#sum_pairs)调用这个递归函数,这样我就可以格式化我需要的输出,但是当我这样做并尝试将它存储在变量对中时,它返回的只是一个空哈希,甚至虽然当我从控制台调用它时它会返回完整的哈希。
这是我的代码:
$starts = [0]
def sum_pairs(ints, s)
pairs = find_pairs(ints,s)
pairs[pairs.keys.min]
end
def find_pairs(ints, s)
sums = {}
ints.each_with_index do |n, idx|
next if idx < $starts.last
right_idx = completes(ints, idx, n, s)
if right_idx.nil?
return sums if idx == (ints.length - 1)
next
else
sums[right_idx] = [n, (s - n)]
$starts << idx
sums.merge!(sum_pairs(ints[0...right_idx], s))
sums
end
end
end
def completes(ints, idx, n, s )
ints.each_with_index do |num, index|
next if index <= idx
return index if num == s - n
end
nil
end
我知道我可以通过迭代来做到这一点,它可能会更有效或同样有效,但我试图用它来更好地理解递归,谢谢!
【问题讨论】:
-
您能否提供更多示例来说明所需的结果?你说你应该返回最左边元素首先出现的对。你的意思是先出现在索引方面?如果是这样,您不应该返回
[5,5],因为索引 1 出现在索引 3 之前吗? -
你能显示
completes方法的代码吗? -
对不起,我想说的是最右边的。只是改变了它并添加了完成方法
-
产生问题的示例输入也很有用 - 帮助人们重现问题,而不是要求他们猜测