Código
#include<stdio.h> int main(void) { char *s1 = "aaaabbbcccddddee"; funcion(s1); //Mandamos la candena de s1 a la "funcion" return 0; } char funcion(char *s) //Se recive como parametro un apuntador a una Cadena X { if(!(*s)) //Evaluamos si la posicion 0 de la cadena X "Actual" es 0, en caso de que lo sea se termina esta funcion por el return return *s; if(*s != funcion(s + 1)) //Enviamos la cadena actual a la funcion, pero... pero.. la enviamos apartir de la posicion 1, esto es la posicion 0 (Inicial) se omite se manda la posicion 1 ejemplo si la cadena "Actual" es "ABCDE\0" se manda la funcion recursiva "BCDE\0" printf("%c",*s); //Y en el if evaluamos si el caracter en su posicion 0 y el caracter en su posision 1 son caracteres distintos entonces imprimimos el caracter actual return *s; } /* Entontes la funcion dejara de llamarse a si misma cuando llegua al caracter nulo, apartir de ahi se imprimiran primero los ultimos caracteres llamados, esto es, la ultima funcion valida llamada tiene el ultimo caracter y ese es el primer printf que se ejecuta una vez que aplique el return se ejecutaran los printf de las funciones anteriores */
Y solo me queda comentar que el código proporcionado por el usuario do-while es, a mi punto de vista una verdadera pieza maestra!!!
Muestra un gran nivel del uso del lenguaje
Saludos!