[ Foro de C++ ]

pregunta de recursividad

25-Jan-2021 12:15
Julián Alzola Zarate
2 Respuestas

Hola: tengo como duda ¿el siguiente código que hice (que ejecutandose parece andar bien) si me salió más complejo de lo que se necesita o no?
Lo que el programa hace es (dada una fracción, por ej 4/8) va preguntandose (si se puede dividir) y llega a 1/2.

-----------------------------


#include <cstdlib>
#include <iostream>

using namespace std;

int cantidadFactores(int nx1, int nx2,int x)
{
	if (x==1)
	{
		if(nx2%nx1 == 0){
			
			nx2=nx2/nx1;
			nx1=1;
			cout<<" "<<nx1<<"/"<<nx2<<" ";

		}
		cout<<" , la fraccion no es mas reductible";
		return 0;
	}
	else if (nx1%x == 0 && nx2%x == 0)
	{
		nx1=nx1/x;
		nx2=nx2/x;
		cout<<"la fraccion es: "<<nx1<<"/"<<nx2<<" ";

		cout<<" , se dividio por "<<x<<", ";
		if(x==1)
		{
	        	return 0;
		}
		else
		{
			return cantidadFactores(nx1,nx2,x-1);
		}
	}
	else
	    return cantidadFactores(nx1,nx2,x-1);
}

int main(int argc, char *argv[])
{
	int x1=16,x2=32,cont1=0,cont2=0;
	cout<<"ingrese 2 numeros enteros, primero: ";
	cin>>x1;
	cout<<"segundo: ";
	cin>>x2;

	int aux;
	if(x1>x2)
	{
	    aux=x1;
	    x1=x2;
	    x2=aux;
	}

	cout<<endl<<"la fraccion es: "<<x1<<"/"<<x2<<endl;
	
	cantidadFactores(x1,x2,x1-1);

	cout<<endl;
	system("pause");
	return 0;
}


 


25-Jan-2021 13:12
Nacho Cabanes (+84)

A priori, la lógica parece correcta, aunque es difícil de seguir con esos nombres de variable tan crípticos (¿no sería mejor "numerador" en vez de "nx1"? ¿qué es x? ¿el siguiente divisor a probar?) y sin espacios junto a los operadores.

En cualquier caso, no creo que necesites intercambiar los valores (una fracción como 5/3 es correcta) y no tengo certeza que se comporte bien en todos los casos, porque no estoy seguro de entender tu lógica ni de que no debas volver a probar el mismo divisor en caso de encontrar una coincidencia.


31-Jan-2021 21:24
Invitado (amadeo)

hola julián

como dices:
- Lo que el programa hace es (dada una fracción, por ej 4/8) va
  preguntandose (si se puede dividir) y llega a 1/2.

te paso código iterativo y recursivo

como verás en el recursivo si aumentas x10 el numerador o denominador, la pila se rompe

con el método iterativo el límite es la capacidad del tipo que es mucho más que el recursivo, a demás de más claro y más corto

https://www.online-ide.com/217tLovYh8

https://www.online-ide.com/mhukpZCWG3

saludos ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)