変数のスコープが分かりやすくても安全そうに見えないのはいいのか。int[] aを汚すことに抵抗は無いのか。
求める配列の長さが本質的に不明なら、泥臭いことをせずにArrayListを使うべきじゃないのか。

recursiveを動かしてみたのか。loopバージョンを機械的に変形させようとして失敗しているがいいのか。

ADTもパターンマッチも無い言語で、対象が再帰的な型でない処理は無理して再帰にする必要性は無い。loopバージョンで十分。
けど再帰が使いやすい言語で再帰に適した処理を行うとき、変数のスコープが云々っていう主張はよく分からなくなる。
>>338のloopと同じ挙動のコードを再帰で素直にOCamlで書くと、
http://ideone.com/ItSSmZ
みたいになる。
添字outer, innerのような何を指しているのか見づらい変数や、a[outer++] = a[inner]というような破壊的代入が無い分、
何がしたいのか>>338より分かりやすくないか?分かりやすい分だけ、信頼性の向上にも寄与していると思うがな。