ループを使わずに配列の順序を逆にする

プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集 - ZDNet Japan

ループを使わずに配列の順序を逆にする。

という件があったのでチャレンジしてみた。

#include <iostream>
#define ARRAY_NUM(a) (sizeof(a)/sizeof(a[0]))
using std::cout; using std::endl;

template<class T>
void reverse(T* a,int num,int start=0) {
    if ( (num-1)/2 <= start ) return;
    T tmp = a[start];
    a[start] = a[num-1-start];
    a[num-1-start] = tmp;
    reverse(a,num,++start);
}

int main () {
    int a[] = {1,2,3,4,5,6,7,8,9,10};
    int num = ARRAY_NUM(a);
    
    reverse(a,num);
    
    for(int i=0;i<num;++i){
        cout << a[i] << endl;
    }
    
    return 0;
}
$ main
10
9
8
7
5
6
4
3
2
1

再帰を利用。思ったより短いコードで書けたので満足。