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

Problema en algoritmo recursivo!!!

Estas en el tema de Problema en algoritmo recursivo!!! en el foro de C/C++ en Foros del Web. Hola amigos, tengo un problema al implementar una version recursiva de un algoritmo que he realizado, me da valores distintos, espero que puedan ayudarme, aca ...
  #1 (permalink)  
Antiguo 17/05/2013, 07:40
 
Fecha de Ingreso: noviembre-2012
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta Problema en algoritmo recursivo!!!

Hola amigos, tengo un problema al implementar una version recursiva de un algoritmo que he realizado, me da valores distintos, espero que puedan ayudarme, aca les dejo el codigo de forma Iterativa ( OK ) y el codigo de forma Recursiva que no esta OK.

Los juegos de datos no dan iguales:

El algoritmo trata de dada 2 posiciones de origen y destino en un tablero, buscar la cantidad de caminos entre ellos.


espero su ayuda no se en que me equivoco

Algoritmo Iterativo (OK)
Código:
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>

using namespace std;
int n , dp [1000][1000], x, y, xx, yy;
bool mark [1000][1000];

struct Punto
{
    int x;
    int y;
};

Punto inicio, fin , aux;
queue < Punto > lista;
int direcciones[3][2] = { {0,1}, {1,0}, {1,1} }; 

void BFS()
{
    lista.push(inicio);
    dp[ inicio.x ][ inicio.y ] = 1;
    while( !lista.empty() )
    {
        aux = lista.front();
        lista.pop();
        x = aux.x;
        y = aux.y;
        for(int i=0 ; i<3 ; i++) 
        {
            xx = direcciones[i][0]+x;
            yy = direcciones[i][1]+y;
            if( xx>0 && xx <= n && yy > 0 && yy <= n ) 
            {
                dp[xx][yy] += dp[x][y]; 
                if(!mark[xx][yy])
                {
                    mark[xx][yy] = true;
                    aux.x = xx;
                    aux.y = yy;
                    lista.push( aux );
                }
            }
        }
    }
}

int main()
{    
    cin>>n;
    cin>>x>>y;
    inicio.x = x;
    inicio.y = y;
    cin>>x>>y;
    fin.x = x;
    fin.y = y;
    BFS(); 
    cout<< dp[fin.x][fin.y] <<endl;
    system("pause");
    return 0;
}
Algoritmo Recursivo mal
Código:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int n , dp [1000][1000], x, y, xx, yy;
bool mark [1000][1000];

struct Punto
{
    int x;
    int y;
};

Punto inicio, fin , aux;
queue < Punto > lista;
int direcciones[3][2] = { {0,1}, {1,0}, {1,1} }; 

void BFS(Punto aux){
	x=aux.x;
	y=aux.y;
	for(int i=0;i<3;i++){
		xx=direcciones[i][0]+x;
		yy=direcciones[i][1]+y;
		if( xx>0 && xx <= n && yy > 0 && yy <= n )
		{
			dp[xx][yy] += dp[x][y]; 
			if(!mark[xx][yy])
			{
				mark[xx][yy] = true; 
				aux.x = xx;
				aux.y = yy;
				BFS( aux );
			}
		}
	}
}

int main()
{
    cin>>n;
    cin>>x>>y;
    inicio.x = x;
    inicio.y = y;
    cin>>x>>y;
    fin.x = x;
    fin.y = y;
   
    dp[ inicio.x ][ inicio.y ] = 1;
    BFS(inicio);
  
    cout<< dp[fin.x][fin.y] <<endl; 
    system("pause");
    return 0;
}
saludos
cronos
  #2 (permalink)  
Antiguo 17/05/2013, 08:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema en algoritmo recursivo!!!

Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <string.h>
  6. #include <vector>
  7. #include <queue>
  8.  
  9. using namespace std;
  10. int n , dp [1000][1000], x, y, xx, yy;
  11. bool mark [1000][1000];
  12.  
  13. struct Punto
  14. {
  15.     int x;
  16.     int y;
  17. };
  18.  
  19. Punto inicio, fin , aux;
  20. queue < Punto > lista;
  21. int direcciones[3][2] = { {0,1}, {1,0}, {1,1} };
  22.  
  23. void BFS()
  24. {
  25.    
  26.     if( !lista.empty() )
  27.     {
  28.         aux = lista.front();
  29.         lista.pop();
  30.         x = aux.x;
  31.         y = aux.y;
  32.         for(int i=0 ; i<3 ; i++)
  33.         {
  34.             xx = direcciones[i][0]+x;
  35.             yy = direcciones[i][1]+y;
  36.             if( xx>0 && xx <= n && yy > 0 && yy <= n )
  37.             {
  38.                 dp[xx][yy] += dp[x][y];
  39.                 if(!mark[xx][yy])
  40.                 {
  41.                     mark[xx][yy] = true;
  42.                     aux.x = xx;
  43.                     aux.y = yy;
  44.                     lista.push( aux );
  45.                 }
  46.             }
  47.         }
  48.         BFS();
  49.     }
  50. }
  51.  
  52. int main()
  53. {    
  54.     cin>>n;
  55.     cin>>x>>y;
  56.     inicio.x = x;
  57.     inicio.y = y;
  58.     cin>>x>>y;
  59.     fin.x = x;
  60.     fin.y = y;
  61.  
  62.     lista.push(inicio);
  63.     dp[ inicio.x ][ inicio.y ] = 1;
  64.     BFS();
  65.     cout<< dp[fin.x][fin.y] <<endl;
  66.     return 0;
  67. }
  #3 (permalink)  
Antiguo 18/05/2013, 08:30
 
Fecha de Ingreso: noviembre-2012
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problema en algoritmo recursivo!!!

Hola razpeitia, usted me ha puesto 1 codigo el cual no le veo nada, si pudiese explicarse que quiso decir con ello?

saludos
cronos
  #4 (permalink)  
Antiguo 18/05/2013, 10:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema en algoritmo recursivo!!!

Es el algoritmo recursivo que pidió.

Simplemente en lugar del while lo cambie a una recursion y el código que tenia al principio lo puse antes de ejecutar esa función.

Es el mismo código que tu programa iterativo solamente cambie 4 lineas. 2 las movi de lugar, una la añadi y otra le cambie unos cuantos caracteres.

En mi opinión pensar de manera recursiva no es tan difícil, solamente piensas como si las funciones fueran sándwiches.
  #5 (permalink)  
Antiguo 18/05/2013, 10:21
 
Fecha de Ingreso: noviembre-2012
Mensajes: 12
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Problema en algoritmo recursivo!!!

Hola, gracias por su respuesta, ahhora una pregunta que tipo de resursividad es la que se usa en este algoritmo, y he oido que existe el tipo complejidad u orden para los algoritmos recursivos, en este caso como hallo esto?

saludos
mariam
  #6 (permalink)  
Antiguo 18/05/2013, 11:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema en algoritmo recursivo!!!

Tiene la misma complejidad que algoritmo iterativo ya que usa recursion simple.

Puedes usar el Master theorem para obtener la complejidad de un algoritmo recursivo.

En este caso pasar BFS de iterativo a recursivo es el peor ejemplo que tu maestro te pudo haber puesto. Por que realmente no hay recursion significativa.

Un ejercicio como pasar de:
Código C++:
Ver original
  1. for(int i = 0; i < 10; i++)
  2.     printf("%d\n", i);

A una función recursiva tiene el mismo valor que tu ejercicio.

Algunos ejercicios que te pueden servir:
1. Factoriales (recursiva e iterativa)
2. Números de fibonacci (recursiva e iterativa)
3. Dado un numero imprime (por ejemplo 5) imprime: 123454321 (recursiva e iterativa)

Etiquetas: int, string, struct
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 12:21.