Autor Tema: Unas dudas  (Leído 1921 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado thecrow_94

  • PIC10
  • *
  • Mensajes: 9
Unas dudas
« en: 09 de Febrero de 2005, 12:46:00 »
Una de ellas es q si por ejemplo en esta funcion float f (int x) le paso un valor negativo considera el signo menos la funcion o no. Y otra es un programilla q no me entero de lo q ace haber si me lo podeis explicar paso a paso gracias, aqui le pongo:

4ª Pregunta: (0,5 puntos)


Cual es el resultado,en pantalla, de ejecutar la siguiente funcion cuando el parametro que se le pasa es 6
 funcion (int n){
  static a=0;
 
  if (n>0) {
    a++;
    n=n-a;
    funcion(n);
    printf ("n=%d
", n);
  }
  else
    printf ("FIN
"Giño;
}
 

SOLUCION:

FIN
n=0
n=3

Desconectado roc364

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 108
RE: Unas dudas
« Respuesta #1 en: 10 de Febrero de 2005, 08:45:00 »
jeje, para entender lo que es la recursividad, primero hay que entender la recursividad!!!

Un saludo.
Hay solo 10 tipos de personas, los que entienden el codigo binario, y los que no.

Viva La Patagonia Argentina!!

Desconectado damago

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
RE: Unas dudas
« Respuesta #2 en: 11 de Febrero de 2005, 04:14:00 »
Hola " "....

Giño No pierdes ningun signo al pasar un valor a una funcion.

Giño En el ejemplo que pones, tienes que notar que dentro de la funcion se vuelve a llamar a la misma funcion antes de que al primera termine (esto es recursividad).

Comentemos el ejemplo para que lo veas claro. Inicialmente "n=6".

IMPORTANTE: "a" esta definida como "static", luego no sera inicializada a "0" cada vez que se llame a la funcion, solo la primera vez. Si no fuera static ya sabes que pasaria, siempre a=0 al entrar en la funcion.

Empecemos.

1º entrada) "n=6". Inicializa "a=0". Incrementa "a" una unidad ("a=1"). "n=n-a" por lo que "n=6-1=5". ahora "n" vale 5. Llamos de nuevo a la funcion (con ese nombre tan original, funcion Muchas risas). Aqui se para la ejecucion de la primera entrada a la funcion. Osea no se ejecuta el "printf" aun

2º entrada) Ahora "n=5". No se inicializa "a", luego "a=1". Incrementamos a en una unidad ("a=2"). Realizamos la resta--> "n = 5-2 = 3". Este es el nuevo valor de "n". Ahora llamamos la tercera vez a la funcion.

IMPORTANTE: Los variables definidas dentro de una funcion, son locales. Es decir, para nuestro caso....la variable "n" de la segunda entrada a la funcion no es la misma variable "n" de la entrada a la primera funcion. No estamos chafando el valor de "n" en la primera ejecucion de la funcion, la cual no ha terminado y "n" sigue valiendo 6. La variable "n" de la segunda ejecucion de la funcion vale 5 y aunque se llamen igual, son diferentes. Fisicamente son posiciones distintas de memoria.
En cambio "a" que esta definida como "static" si que es la misma "a" para todas las llamadas. okis??

3º entrada) como "n" sigue siendo mayor de 0, volvemos a lo mismo. Incrementamos a en una unidad (a=3). Realizamos la resta--> "n= 3-3 = 0". Volvemos a llamar a la funcion....

4º entrada)  Ahora "n" ya vale 0, luego no entramos en el "if", sino en el "else".  Aqui si termina la ejecucion de esta funcion con un "printf("FIN
"Giño;

Como ha terminado la 4º entrada, ahora sigue ejecutandose la 3º por donde se habia quedado... osea le faltaba imprimr con un printf el valor de "n" que era 0.

Ya ha terminado la 3º entrada, y se pasa a continuar con la 2º donde estaba. Lo mismo imprime "n" que valia 3.

Acaba la 2º y lo mismode nuevo....ahora etrmina de ejecutarse la primera... e imprime "n", que valia 5."

No se si escribiendo tanto habre liado o no. Intentaba explicar paso a paso lo que sucede para que entiendas la recursivad, y el concepto de la variables estaticas y locales.

Un saludo.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Unas dudas
« Respuesta #3 en: 12 de Febrero de 2005, 15:49:00 »
Pues yo lo entendi a la PERFECCION!!, y eso que soy el mas lento del foro Sonrisa Gigante
Salu2 panas