# ループも再帰も継続も使わずに配列の順序を逆にする。 _published: 2010/03/12_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20100312/1268385384) ループを使わずに配列の順序を逆にする。なんか流行ってるらしいです。 元ネタは、これの2ページ目。 - [プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集 - ZDNet Japan](http://japan.zdnet.com/sp/feature/07tenthings/story/0,3800082984,20409456,00.htm) valvallowさんがやってたので、自分も参戦します。 - [vallog: 流行ってるようなので「ループを使わずに配列の順序を逆にする」](http://valvallow.blogspot.com/2010/03/blog-post.html) - [vallog: ”再帰も”ループも使わずに配列を逆順にする:継続呼び出し編](http://valvallow.blogspot.com/2010/03/blog-post_12.html) 私は、ループも再帰も継続も使わずに、配列の順序を逆にします。要は、「繰り返し」を使わずに、配列の順序を逆にします。もちろん、スポンジや食器用洗剤も使いません。ただし、油汚れは落ちません。 ```ruby a = [0, 1, 2, 3, 4] a.size.times do |i| puts a[i] end class Array def indexer_alt(nth) self.indexer_org(self.size - nth - 1) end alias_method :indexer_org, :[] alias_method :[], :indexer_alt end a.size.times do |i| puts a[i] end ``` 逆になったでしょ?配列そのものではなくて、インデックス側をいじる。上のコードではメタプログラミングしてます。Lispなら、マクロでいけると思います。メタプログラミングできない言語なら、下のようなコード。 ```ruby a = [0, 1, 2, 3, 4] def reverse_indexer(array, nth) array[array.size - nth - 1] end a.size.times do |i| puts reverse_indexer(a, i) end ``` 配列そのものが逆順になっていないですって?常に逆順に取り出している限り、逆順になっていないことを証明できませんよね。それでは、 `each` も逆順にしますよ。 ```ruby a = [0, 1, 2, 3, 4] class Array def each_alt self.each_index do |i| yield self[self.size - i - 1] end end alias_method :each, :each_alt end a.each {|x| puts x} ``` おまけ。 `p` の出力結果も逆順に。 ```ruby a = [0, 1, 2, 3, 4] class Array def inspect_alt self.inject("[") {|x, y| "#{x}#{y}, "} [0..-3] + "]" end alias_method :inspect, :inspect_alt end p a #=> [4, 3, 2, 1, 0] ``` 数学的に数列を逆順にする方法がないかと探していたら、Z変換というのに行き着きました。Z変換というのは、離散群上でのラプラス変換だそうです。すみません。意味がわかりません。まったく関係ないかもしれません。油汚れも落ちません。