Ruby 递归多维数组

Ruby 递归多维数组,ruby,recursion,multidimensional-array,Ruby,Recursion,Multidimensional Array,所以我的任务是递归地反转多维数组。 我似乎不知道该怎么做 我已经编写了可以反转多维数组的代码,但它不是递归的。 你们能帮我做个循环吗 最后应该是这样的: ary = [1,[1,22,[5,7,0],8],2,3] reverse_rek(ary) #=> [3, 2, [1, 22, [5, 7, 0], 8], 1] 以下是我的尝试: def reverse_rek(ary) if not ary.is_a?(Array) raise ArgumentError, "Di

所以我的任务是递归地反转多维数组。 我似乎不知道该怎么做

我已经编写了可以反转多维数组的代码,但它不是递归的。 你们能帮我做个循环吗

最后应该是这样的:

ary = [1,[1,22,[5,7,0],8],2,3]
reverse_rek(ary)
#=> [3, 2, [1, 22, [5, 7, 0], 8], 1]
以下是我的尝试:

def reverse_rek(ary)
  if not ary.is_a?(Array)
    raise ArgumentError, "Dies ist kein Array"
  end
  reverse_rek_intern(ary)  
end

def reverse_rek_intern(ary)
  len = ary.length-1
  reverse_ary =[]
    ary.each_index { |index| 
      reverse_ary[index] = ary[len-index]
    }
  return reverse_ary
end
谢谢大家!

就地版本

def recursive_reverse!(thing)
  case thing
    when Array
      thing.reverse!
      thing.map!{|x| recursive_reverse! x}
    else
      thing
  end
end
感叹号表示它修改了原始结构

以及安全版本,它不会在任何深度级别修改原始阵列或其子阵列

def recursive_reverse(thing)
  case thing
    when Array
      thing.reverse.map{|x| recursive_reverse x}
    else
      thing
  end
end
您还可以将
pop()
unshift()
一起使用,如下所示:

def reverse_rek(ary)
  if not ary.is_a?(Array)
    raise ArgumentError, "Dies ist kein Array"
  end
  reverse_rek_intern(ary)  
end

def reverse_rek_intern(ary)
  last = ary.pop
  reverse_rek_intern(ary) unless ary.empty?
  ary.unshift(last)
end
def reverse_rek(ary)
  return ary unless ary.is_a?(Array)

  last = ary.pop
  reverse_rek_intern(ary) unless ary.empty?
  ary.unshift(last)
end
或者,将两种方法合并为一种:

def reverse_rek(ary)
  raise ArgumentError, "Dies ist kein Array" unless ary.is_a?(Array)

  last = ary.pop
  reverse_rek_intern(ary) unless ary.empty?
  ary.unshift(last)
end
任一选项都将产生所需的输出:

ary = [1,[1,22,[5,7,0],8],2,3]
reverse_rek(ary)
#=> [3,2,[1,22,[5,7,0],8],1]

正如Peter在中指出的,我同意,当接收到的参数不是数组时,最好返回对象本身,而不是引发错误

因此,上述方法可以更新如下:

def reverse_rek(ary)
  if not ary.is_a?(Array)
    raise ArgumentError, "Dies ist kein Array"
  end
  reverse_rek_intern(ary)  
end

def reverse_rek_intern(ary)
  last = ary.pop
  reverse_rek_intern(ary) unless ary.empty?
  ary.unshift(last)
end
def reverse_rek(ary)
  return ary unless ary.is_a?(Array)

  last = ary.pop
  reverse_rek_intern(ary) unless ary.empty?
  ary.unshift(last)
end

到目前为止,所有答案都受到模拟多态性的影响。使用非OO代码模拟OO行为。检查某个东西是否是数组是一种致命的泄露。下面的代码为数组和对象创建一个reverse_rek方法

class Object
  def reverse_rek
    self
  end
end

class Array
  def reverse_rek
    reverse.map{|element| element.reverse_rek }
  end
end
下面是一些正在运行的代码示例:

irb(main):003:0> [1,2,3].reverse_rek
=> [3, 2, 1]
irb(main):004:0> [1,[2.0,2.1,2.3],3].reverse_rek
=> [3, [2.3, 2.1, 2.0], 1]
irb(main):005:0> [1,[2.0,2.1,2.3],['a','b','c'],3].reverse_rek
=> [3, ["c", "b", "a"], [2.3, 2.1, 2.0], 1]
一个区别是,这段代码不会在非数组上生成错误,而是
就让他们自己回来吧。在某种意义上,它们被视为具有一个元素的数组。因此不需要逆转。提出错误并不是一项要求。

这似乎是一个一维数组。试着把你的问题变小-看看你在循环中有什么-在
index=0
之后,你可以反转第一个和最后一个索引(你现在需要实际交换),现在你需要反转更小的东西,一个从
index=1
开始的数组。考虑何时停止。不,对不起,我没有把这个弄清楚。我应该只交换“最上面的”数组。就像在这个例子中一样,我不明白为什么它不仅仅是
ari.reverse
。我错过什么了吗?为什么该方法应该是递归的?当我尝试修改或使用您提供的版本时,我总是会得到一个参数错误。一旦我使用多维数组。。。