Ruby:标准递归模式

Pla*_*Ton 5 ruby recursion design-patterns

我常常在ruby中加入的一件事是递归模式.例如,假设我有一个数组,并且可能包含数组作为无限深度的元素.所以,例如:

my_array = [1, [2, 3, [4, 5, [6, 7]]]]
Run Code Online (Sandbox Code Playgroud)

我想创建一个可以将数组展平的方法[1, 2, 3, 4, 5, 6, 7].

我知道.flatten会做这个工作,但这个问题是我经常遇到的递归问题的一个例子 - 因此我试图找到一个更可重用的解决方案.

简而言之 - 我猜这种东西有一个标准模式,但我无法想出任何特别优雅的东西.任何想法都赞赏

tok*_*and 5

递归是一种方法,它不依赖于语言.您在编写算法时考虑了两种情况:再次调用函数的函数(递归情况)和破坏它的函数(基本情况).例如,要在Ruby中进行递归展平:

class Array
  def deep_flatten
    flat_map do |item|
      if item.is_a?(Array)
        item.deep_flatten
      else
        [item]
      end
    end
  end
end 

[[[1]], [2, 3], [4, 5, [[6]], 7]].deep_flatten
#=> [1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?无论如何,这里显示的有用模式是当你在数组上使用recusion时,你通常需要flat_map(each+ concat/ 的功能替代push).