>>104
すでに>>105が指摘しているけど、破壊的代入は副作用の一つだよ

副作用の無い「関数型プログラミング」と呼ばれる作法に従えば、
以下のコードになる

http://ideone.com/d48CGm

詳しくは以下の文書を参照
・Rubyによる関数型プログラミング
 http://www.h6.dion.ne.jp/~machan/misc/FPwithRuby.html

あと蛇足を加えると:
・上記のコードでは、reduce ではなく inject を用いた
・効率という視点では破壊的代入を用いる>>104のコードのほうが優れている
・わざわざメソッド String#chars で文字列を文字の配列に展開するよりも、
 ブロックを伴わないメソッド String#each_char は列挙オブジェクト
 (enumerator)を返すから、それを直接inject(あるいは reduce)へ
 チェーンさせたほうが効率的である