Reverse an array without using a loop in ruby

后端 未结 8 454
时光说笑
时光说笑 2021-01-24 12:12

I have a coding challenge to reverse a an array with 5 elements in it. How would I do this without using the reverse method?

Code:

def reverse(array)
 a         


        
相关标签:
8条回答
  • 2021-01-24 13:01

    The obvious solution is to use recursion:

    def reverse(array)
      return array if array.size < 2
      reverse(array.drop(1)) + array.first(1)
    end
    

    We can make this tail-recursive using the standard accumulator trick:

    def reverse(array, accum=[])
      return accum if array.empty?
      reverse(array.drop(1), array.first(1) + accum)
    end
    

    But of course, tail recursion is isomorphic to looping.

    We could use a fold:

    def reverse(array)
      array.reduce([]) {|accum, el| [el] + accum }
    end
    

    But fold is equivalent to a loop.

    def reverse(array)
      array.each_with_object([]) {|el, accum| accum.unshift(el) }
    end
    

    Really, each_with_object is an iterator and it is the side-effectful cousin of fold, so there's actually two reasons why this is equivalent to a loop.

    0 讨论(0)
  • 2021-01-24 13:08

    Konsolebox is right. If they are asking for the method without loops, that simply means that you cannot use any kind of loop whether it is map, each, while, until or any even built in methods that use loops, like length, size and count etc.

    Everything needs to be recursive:

    def recursive_reversal(array)
    
      return array if array == [] # or array.empty?
      last_element = array.pop
      return [last_element, recursive_reversal(array)].flatten
    
    end
    

    Ruby uses recursion to flatten, so flatten will not entail any kind of loop.

    0 讨论(0)
提交回复
热议问题