case 3: return u > v ? gcm((u-v)/2, v) : gcm((v-u)/2, u);

これ姑息って感否めないw
case 3: return u > v ? gcm(u-v, v) : gcm(v-u, u);

あと、これホント動くの?
gcm(0,3)->gcm(0,3)->gcm(0,3)->.........

いーけどね別に。趣味の問題だからw