Ruby Получение максимального значения из вновь созданного массива в одной функции - PullRequest
0 голосов
/ 02 июля 2018

Я хочу, чтобы моя функция возвращала самый длинный массив во вложенном массиве (включая сам массив), поэтому

nested_ary = [[1,2],[[1,2,[[1,2,3,4,[5],6,7,11]]]],[1,[2]]
deep_max(nested_ary)
 => [1,2,3,4,[5],6,7,11]

simple_ary = [1,2,3,4,5]
deep_max(simple_ary)
 => returns: [1,2,3,4,5]

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

мой код:

def deep_max(ary)
  ary.inject([ary]) { |memo, elem|
  if elem.is_a?(Array)
    memo.concat(deep_max(elem))
  else
    memo
  end }
end

Это дает мне то, что я хочу:

deep_max(nested_ary).max_by{ |elem| elem.size }

Есть ли способ получить этот максимум внутри функции?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018
def deep_max(arr)
  biggest_so_far = arr
  arr.each do |e|
    if e.is_a?(Array)
      candidate = deep_max(e)
      biggest_so_far = candidate if candidate.size > biggest_so_far.size
    end
  end
  biggest_so_far
end

deep_max [[1, 2], [[1, 2, [[1, 2, 3, 4, [5], 6, 7, 11]]]], [1, [2]]]
  #=> [1, 2, 3, 4, [5], 6, 7, 11]
0 голосов
/ 02 июля 2018

Вы можете развернуть его:

def deep_max(ary)
  arys = []
  ary = [ary]
  until ary.empty?
    elem = ary.pop
    if elem.is_a?(Array)
      ary.push(*elem)
      arys.push(elem)
    end
  end
  arys.max_by(&:size)
end

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

...