(各再帰呼び出しの1だけインクリメント次いで0最初のコールに及び)(nil
をデフォルト)最大深さを指定するパラメータを導入し、現在の深さを追跡するために、パラメータ:
def my_flatten(arr, max_depth = nil, current_depth = 0)
arr.reduce([]) do |result, item|
item.is_a?(Array) && (max_depth.nil? || current_depth < max_depth) ?
result + my_flatten(item, max_depth, current_depth + 1) : result << item
end
end
あなたはこれをより読みだと感じた場合は、if/else
で?:
を置き換えることができます:
:
def my_flatten(arr, max_depth = nil, current_depth = 0)
arr.reduce([]) do |result, item|
if item.is_a?(Array) && (max_depth.nil? || current_depth < max_depth)
result + my_flatten(item, max_depth, current_depth + 1)
else
result << item
end
end
end
これは今期待される結果を返します。
my_flatten(a) #=> [1, 2, 3, 4, 5]
my_flatten(a, 1) #=> [1, 2, 3, [4, 5]]