3

这是我在作业中遇到的问题。

  • 数组 A 有两个元素:数组 B 和数组 C。
  • 数组 B 有两个元素:数组 D 和数组 E
  • 在某些时候,数组 X 只包含两个元素:字符串 a 和字符串 b。

我不知道如何确定数组 A 的深度。例如:

arrA = [
         [
           [1,2]
         ]
       ]

我已经测试过:A[0][0][0] == nilwhich 返回false. 而且,A[0][0]..[0] == nil总是返回false。所以,我无法通过这种方式知道数组 A 的深度。

4

5 回答 5

9

如果这不是你要找的,它应该是一个很好的起点:

def depth (a)
  return 0 unless a.is_a?(Array)
  return 1 + depth(a[0])
end

> depth(arrA)
=> 3

请注意,这仅测量第一个分支的深度。

于 2012-06-02T15:15:51.887 回答
5

我下面的解决方案回答了任何数组的最大深度:

示例:对于 arr= [ [[1],[2,3]], [[[ 3,4 ]]] ],对于 3,4,arr 的最大深度为4

Aprroach - 变平一层并进行比较

b, depth = arr.dup, 1

until b==arr.flatten
  depth+=1
  b=b.flatten(1)
end
puts "Array depth: #{depth}" #=> 4

希望它能回答你的问题。

于 2012-06-02T15:33:48.810 回答
2

一个简单的纯函数递归解决方案:

def depth(xs, n=0)
  return case
  when xs.class != Array
    n
  when xs == []
    n + 1
  else
    xs.collect{|x| depth x, n+1}.max
  end
end

例子:

depth([]) == 1
depth([['a']])) == 2
depth([1, 2, 3, 4, [1, 2, 3, [[2, 2],[]], 4, 5, 6, 7], 5, 5, [[[[[3, 4]]]]], [[[[[[[[[1, 2]]]]]]]]]]) == 10
于 2016-04-10T17:40:38.227 回答
1

如果您想使用,还有一行代码

   def depth (a)
        a.to_s.count("[")
    end
于 2021-09-22T06:24:15.440 回答
0

这是一个类似于Kiddorails 解决方案的单行代码,提取到方法中:

def depth(array)
  array.to_a == array.flatten(1) ? 1 : depth(array.flatten(1)) + 1
end

它会在计算维度的同时将数组 1 维展平,直到它不能再展平。

为什么这比其他解决方案更好?

  • 不需要修改本机类(如果可能,请避免)
  • 不使用元编程(is_a?, send,respond_to?等)
  • 相当容易阅读
  • 也适用于哈希(注意array.to_a
  • 确实有效(不像只检查第一个分支和其他愚蠢的东西)
于 2017-09-07T15:42:06.820 回答