Se me ocurrio esta solucion al ejercicio, no entendí bien la del examen.
Esta funciona?
void genera_gray(short m){
if(m==1){
mem[0]=0;
mem[1]=1;
}
else{
genera_gray(m-1);
for(int n=(1<<m-1);n<(1<<m);n++){
mem[n]=(1<<m-1)+mem[(1<<m)-n-1];
}
}
}