【问题标题】:Recursion Multidimensional Array递归多维数组
【发布时间】:2017-11-28 10:11:53
【问题描述】:

所以我的任务是递归地反转多维数组。 我似乎无法弄清楚如何。

我编写的代码可以反转多维数组,但它不是递归的。 你们能帮我让它递归吗?

最后应该是这样的:

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

谢谢!

【问题讨论】:

  • 这看起来像是一个单维数组。尝试让你的问题更小 - 看看你在循环中拥有什么 - 在index=0之后,你可以反转第一个和最后一个索引(你现在需要实际交换),现在你需要反转更小的东西,从index=1 开始的数组。还要考虑何时停止。
  • 不,抱歉,我没有说得很清楚。我应该只交换“最顶层”的数组。就像在示例中一样
  • 我不明白为什么不只是ary.reverse。我错过了什么吗?为什么方法应该是递归的?

标签: ruby recursion multidimensional-array


【解决方案1】:

就地版本

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

【讨论】:

  • 当我尝试修改或使用您提供的版本时,我总是遇到参数错误。一旦我使用了多维数组...
【解决方案2】:

到目前为止,所有答案都受到模拟多态性的影响。使用非 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]

一个区别是这段代码不会在非数组上产生错误,它们 只是返回自己。从某种意义上说,它们被视为具有一个元素的数组。因此不需要反转。没有将引发错误作为一项要求。

【讨论】:

    【解决方案3】:

    您也可以将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)
      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 在 his answer 中指出的那样,我同意,当接收到的参数不是数组时,最好返回对象本身而不是引发错误。

    所以,上面的方法可以这样更新:

    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
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2019-02-20
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      相关资源
      最近更新 更多