salida inesperada en C (recursión)

1 minuto de lectura

avatar de usuario
usuario2748351

int main(void) {
 static int=5;
 if(--i) {
    main();
    printf("%d",i);
   }
 }

la salida del programa anterior es—

0000

Pero creo que debería ser—

1234

no se por que por favor ayúdenme.

  • Creo que quieres decir 4321y lo sería si imprimieras antes de recurriste.

    – Hunter Mc Millen

    04/09/2013 a las 20:15

  • static int i=5; o hay alguna C-magia que establece i a 5?

    – Nick T.

    04/09/2013 a las 23:31

La razón de los ceros es que i se reduce a cero antes del primero printf se ejecuta la declaración. A medida que se desenrolla, imprime i (que sigue siendo cero) cada vez.

Sería mejor usar una función separada que main() llama y pasa un parámetro a (y luego pasa el parámetro a cada llamada en lugar de usar una variable estática).

  1. Estableces una variable estática i a 5
  2. usted recurre en main Hasta que i se convierte en cero.
  3. La recursividad se desarrolla con i siendo cero.
  4. Esto entonces llama a la printf

Ahí está la respuesta.

Puedes probar esto usando un depurador

  [First call:  i->4 and call main()]
  [Second call: i->3 and call main()]
  [Third call:  i->2 and call main()]
  [Fourth call: i->1 and call main()]
  [Fifth call:  i->0 and condition false as it gives 0.]

Ahora es el momento de imprimir el valor de i, que era la siguiente línea después de main(). El control vuelve a la cuarta a la primera llamada para imprimir el valor de i.

[Fourth Call: printing value of i which is 0.]
[Third call:  printing value of i which is 0.]
[Second call: printing value of i which is 0.]
[First call:  printing value of i which is 0.]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad