Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con recursividad

Estas en el tema de Duda con recursividad en el foro de C/C++ en Foros del Web. Ayer estaba haciendo un problema para sacar un numero x elevado a la y mediante recursividad, y por accidente se me olvido poner una instrucción ...
  #1 (permalink)  
Antiguo 17/07/2015, 15:51
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 9 meses
Puntos: 0
Duda con recursividad

Ayer estaba haciendo un problema para sacar un numero x elevado a la y mediante recursividad, y por accidente se me olvido poner una instrucción return y aun asi corrio bien el programa y no entiendo porque, es decir yo creo que la forma correcta de hacerlo seria algo asi:

Código:
#include <stdio.h>

int potencia(int base, int exponente);

int main()
{
	int x, y;
	
	printf("Especifique base y exponente: ");
	scanf("%d%d", &x, &y);
	
	printf("%d elevado a %d es: %d\n", x, y, potencia(x,y));
	
	return 0;
}

int potencia(int base, int exponente)  //recursividad
{
	if (exponente == 1)
	  return base;
	else
	  return  base * potencia(base,exponente-1);
	  
}
Pero yo en vez de poner return base * potencia(base, exponente-1);
puse base = base * potencia(base,exponente-1);, y aun así me corrió el programa bien...
Lo que no entiendo es que luego de que se llegue a un caso base y se regrese un valor, como se regresaran los demás valores a las funciones anteriores, si no hay una instrucción return...
  #2 (permalink)  
Antiguo 17/07/2015, 17:15
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Duda con recursividad

Quizás te funciona pero depende de la configuración de tu compilador y de la arquitectura de tu pc, es posible que a ti te vaya y que a otros no le vaya y como ya puedes imaginarte es algo que no se debe hacer. Algo que puede haber ocurrido suponiendo que lo hayas compilado para x86 existe un registro especial llamado eax que se encarga de hacer los típicos return de las funciones, aquello de lo que se va a hacer return se suele almacenar en ese registro y para algunos cálculos. Al terminar la función habrá devuelto lo que se ha encontrado en el eax y has tenido la suerte de que ha sido el último cálculo que ha hecho. Sin embargo, como ya te dije, hacer esto es incorrecto básicamente porque no puedes garantizar que el resultado sea correcto.

Saludos y espero haber sido útil.
  #3 (permalink)  
Antiguo 17/07/2015, 20:19
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Duda con recursividad

no será por que al trastear tanto al código los .o estuvieran corrompidos? Es que si no hay return simplemente no se retorna nada, debería petar la pila y ya. Prueba hacer el rebuild del proyecto.
  #4 (permalink)  
Antiguo 18/07/2015, 03:39
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Duda con recursividad

Dudo mucho que para un sólo archivo haya hecho un proyecto. Lo que uno se imagina es eso mismo que tú dices vangodp puesto que en teoría es lo que debería de ocurrir pero no es lo que ocurre ya que al pasar a código máquina el compilador hace magia y se inventa que hay return incluso si no lo hay. Por ejemplo compilo su código con gcc sin tocar absolutamente nada y miro el código máquina que obtengo de la función y saco lo siguiente:


Como puedes ver (dependiendo de lo que estés acostumbrado a leer instrucciones de la máquina) independientemente de lo que se haga en el if se devuelve un valor.

Ahora voy a cambiar la configuración de optimización compilar en gcc -O1. Ahora pruebo a ejecutar el programa y ahora me dice que 2 elevado a 3 es 2, que como todos sabemos no es correcto:


Veamos ahora cual es el código máquina de la función:


Ahora en las llamadas recursivas no almacena finalmente en el dato en el eax, solo almacena el caso base en el mismo, por lo que se que independientemente de lo que ponga siempre me va a devolver la base que ponga. Al compilar así 2 elevado a cualquier cosa siempre valdrá 2, 3 elevado a cualquier cosa siempre valdrá 3 y también queda demostrado que el resultado haciendo este tipo de cosas es impredecible aunque con tantos años de experiencia que llevan los compiladores de C muchas veces atinan por sí sólos aunque nosotros nos equivoquemos.

Ya no voy a hacer más ejemplos pero podéis ir probando con el resto e ir observando los diferentes comportamientos de un código mal escrito.

Saludos.
  #5 (permalink)  
Antiguo 18/07/2015, 07:26
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Duda con recursividad

Bueno.. si lo has comprobando a más bajo nivel pues de fábula, porque yo a tanto no llego jaja. Echaremos un ojo con más tiempo, pero como dije... D código maquina voy pillao.

Saludos.
  #6 (permalink)  
Antiguo 21/07/2015, 02:30
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Duda con recursividad

Aun así no es una buena práctica saltarse ese return.

El código ha de ser legible en todo momento y saltarse un return va en contra de esta norma.

Etiquetas: funcion, int, numero, programa, recursividad
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:58.