добавление элементов массива с использованием рекурсии - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно создать рекурсивную функцию, которая добавляет номера любого данного массива, затем удаляет первый элемент, затем добавляет массив и делает это до тех пор, пока у массива не останется только элемент. моя функция делает это, но в настоящее время я могу видеть только добавление, помещая оператор put, но также нуждаюсь в результатах как возвращаемое значение, как это => [20,20,19,16,10] и не знаю, как go об этом как о том, что результаты ставятся отдельно. Спасибо за вашу помощь. Функция должна делать это рекурсивно: это мой код:

def parts_sums(ls)
    results_arr=[]
    if( ls.length === 1)
     return ls 
    end
     p results =ls.sum
     parts_sums(ls.drop(1))
     p results_arr << results

end
parts_sums([0, 1, 3, 6, 10])

# ls = [0, 1, 3, 6, 10].sum =>20
# ls = [1, 3, 6, 10].sum => 20
# ls = [3, 6, 10].sum =>19
# ls = [6, 10].sum =>16
# ls = [10]=>10

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вы можете определить метод, подобный этому, который является многословным, но ясным (я думаю):

def parts_sums(ary, res = [])
  res << [ary.dup, ary.sum]
  if ary.size > 1
    ary.shift
    parts_sums(ary, res)
  else
    return res
  end
end

Итак, когда вы вызываете свой массив, вы получаете такой результат:

ary = [0, 1, 3, 6, 10]
parts_sums(ary)
#=> [[[0, 1, 3, 6, 10], 20], [[1, 3, 6, 10], 20], [[3, 6, 10], 19], [[6, 10], 16], [[10], 10]]

Вызовите parts_sums(ary.dup), если хотите сохранить исходный массив.


Который можно переписать кратчайшим путем:

def parts_sums_2(ary, res = [])
  return res unless ary.any?
  res << [ary, ary.sum]
  parts_sums_2(ary[1..-1], res)
end
1 голос
/ 22 апреля 2020
def parts_sums(ls)
  ls.length == 1 ? ls : ([ls.sum] + parts_sums(ls[1..-1]))
end

puts parts_sums([0, 1, 3, 6, 10]).to_s
...