2016-09-09 3 views
0

Я работаю над проблемой, чтобы найти первую пару чисел в массиве, который суммируется с определенной целью. Я должен вернуть пару, в которой первый правый указатель. Так сказать, цель 10 и пары найдено: [5,5] по индексу 1,5 и [3,7] по индексу 3,4 Мне нужно будет вернуть [3,7]. У меня рекурсивная часть работы, проблема в том, что она возвращает хеш с самым левым индексом как ключом, а пара - значением. Я пытаюсь вызвать эту рекурсивную функцию из другой функции (#sum_pairs), чтобы затем форматировать вывод, который мне нужен, но когда я это делаю и пытаюсь сохранить его в парах переменных, все, что он возвращает, это пустой хеш, даже хотя он возвращает завершенный хеш, когда я просто вызываю его из консоли.Сохранение возвращаемого значения рекурсивной функции в переменной в ruby ​​

Heres мой код:

$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 

Я знаю, что я мог бы сделать это с помощью итерации об этом, это, вероятно, будет более или одинаково эффективны, но я пытаюсь использовать это, чтобы лучше понять рекурсию, спасибо!

+1

Можете ли вы предоставить еще несколько примеров желаемого результата? Вы говорите, что вы должны вернуть пару, где первый элемент слева. Вы имеете в виду первое место в индексе? Если да, не стоит ли вам возвращать '[5,5]', потому что индекс 1 появляется перед индексом 3? – davidhu2000

+0

Можете ли вы показать код метода 'completes'? – seph

+0

Извините, что я хотел сказать прямо.Просто изменил это и добавил метод complete –

ответ

0

Я имею в виду не оскорбление, но мне потребовалось некоторое время, чтобы понять ваш код. Возможно, вам нужно будет указать свои методы и параметры более четко, когда вы намерены читать других людей.

Как аутсайдер, мне понадобилось некоторое время, чтобы понять s на весь ваш код, фактически представленный target_number. Также рекомендуется прокомментировать ваши методы, указывающие, как их использовать и каково должно быть ожидаемое возвращаемое значение.

integers = [1,2,3,4,5,6,7,8,9,3,4,5,6,7,8,4,3,2,1] 
target_number = 10 
$current_index = [0] 

def set_right_index(integers, leftmost_index, leftmost_int, target_number) 
    integers.each_with_index do |int, i| 
    next if i <= leftmost_index 
    return i if int == target_number - leftmost_int 
    end 
    nil 
end 

def find_pairs(integers, target_number) 
    sums = {} 

    integers.each_with_index do |int, i| 
    next if i < $current_index.max 
    # debug = [] 
    # debug << set_right_index(integers, i, int, target_number) 
    right_index = set_right_index(integers, i, int, target_number) 

    if right_index.nil? 
     return sums if i == integers.length - 1 
     next 
    end 

    sums[right_index] = [int, (target_number - int)] 
    $current_index << i 
    # sums.merge! sum_pairs(integers[0..right_index], target_number) #<= calling this returns a `stack overflow error` :P because the methods just keeps calling itself 
    sums 
    end 
end 

Теперь, если вы звоните

find_pairs(integers, target_number) 

возвращаемое значение будет выглядеть следующим образом:

{8=>[1, 9], 
7=>[2, 8], 
6=>[3, 7], 
5=>[4, 6], 
11=>[5, 5], 
10=>[6, 4], 
9=>[7, 3], 
17=>[8, 2], 
18=>[9, 1], 
13=>[3, 7], 
12=>[4, 6], 
15=>[6, 4], 
16=>[7, 3]} 

и вы сказали:

проблема возвращает хэш с самым левым индексом в качестве ключа и pai r как значение. Я пытаюсь вызвать эту рекурсивную функцию от другого функции (#sum_pairs), так что я могу затем форматировать вывод, что нужно

Пожалуйста, скажите мне, что именно вы имеете в виду so that I can then format the output I need Как бы вы хотели конечный результат быть как?

EDIT # 1

Для целей отладки, я ставлю все результаты в массиве, а и результат выглядит следующим образом

integers = [1,2,3,4,5,6,7,8,9,3,4,5,6,7,8,4,3,2,1] 
target_number = 10 

=> [{:left_index=>0, :right_index=>8, :values=>[1, 9]}, 
{:left_index=>1, :right_index=>7, :values=>[2, 8]}, 
{:left_index=>2, :right_index=>6, :values=>[3, 7]}, 
{:left_index=>3, :right_index=>5, :values=>[4, 6]}, 
{:left_index=>4, :right_index=>11, :values=>[5, 5]}, 
{:left_index=>5, :right_index=>10, :values=>[6, 4]}, 
{:left_index=>6, :right_index=>9, :values=>[7, 3]}, 
{:left_index=>7, :right_index=>17, :values=>[8, 2]}, 
{:left_index=>8, :right_index=>18, :values=>[9, 1]}, 
{:left_index=>9, :right_index=>13, :values=>[3, 7]}, 
{:left_index=>10, :right_index=>12, :values=>[4, 6]}, 
{:left_index=>12, :right_index=>15, :values=>[6, 4]}, 
{:left_index=>13, :right_index=>16, :values=>[7, 3]}, 
{:left_index=>14, :right_index=>17, :values=>[8, 2]}] 

Пожалуйста, дайте мне знать, как вы хотите, чтобы конечный результат будет как поэтому я могу попробовать.

+0

Извините за ленивое название, оно было написано так же, как и в кодеках, и я сделал Не трать время, чтобы называть их должным образом. Конечным результатом должен быть хеш-элемент с наименьшим значением ключа. Меня больше всего интересует, как это решить, используя рекурсию. Я не получал ошибку переполнения стека при вызове sums.merge! (# Sum_pairs). Он вернул правильное значение –

+0

, которое было бы самым низким значением в массиве хэшей в Edit # 1? right_index => 5? – Shiyason

Смежные вопросы