よく考え直したらもっと簡単に書けるじゃん。
a<bのとき、a%=bはa(変化無し)になるから。

int gcm( int a, int b )
{
 return ( a %= b ) ? gcm( b, a ) : b;
}

って、{}なしで1行に書いてもいいのか?これ。
int gcm( int a, int b ) return ( a %= b ) ? gcm( b, a ) : b;