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

[C++] Posición del menor de un array (forma recursiva)

Estas en el tema de [C++] Posición del menor de un array (forma recursiva) en el foro de C/C++ en Foros del Web. Hola buenas, antes de nada saludar a toda la comunidad de este gran foro. Mi problema es que he escrito una función recursiva que como ...
  #1 (permalink)  
Antiguo 27/05/2010, 11:53
 
Fecha de Ingreso: enero-2010
Mensajes: 21
Antigüedad: 14 años, 2 meses
Puntos: 0
[C++] Posición del menor de un array (forma recursiva)

Hola buenas, antes de nada saludar a toda la comunidad de este gran foro.

Mi problema es que he escrito una función recursiva que como parámetros de entrada tiene un array de enteros y dos enteros para indicar el inicio y el final del array, y devuelve el menor entero del array:

Código C++:
Ver original
  1. int Menor(int s[], int ini, int fin)
  2. {
  3.     int menor, dev;
  4.    
  5.     if(ini == fin)
  6.     {
  7.         menor = s[ini];
  8.     }
  9.     else
  10.     {
  11.         menor = Menor(s, ini + 1, fin);
  12.         if(s[ini] < menor)
  13.         {
  14.             dev = s[ini];
  15.         }
  16.         else
  17.         {
  18.             dev = menor;
  19.         }
  20.     }
  21.     return(dev);
  22. }
Ahora sería interesante poder modificar la función para que en vez de devolver el menor entero, devuelva el índice del array en el que se encuentra, es decir, su posición.
Pero no soy capaz de realizar dicha modificación.
¿Alguien sería tan amable de ayudarme?

Un saludo. ^^
  #2 (permalink)  
Antiguo 27/05/2010, 12:01
 
Fecha de Ingreso: mayo-2010
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: [C++] Posición del menor de un array (forma recursiva)

No le veo sentido hacer esa funcion recursiva, pudiendo hacer un simple bucle que recorra los elementos, siendo mas eficiente un bucle que una funcion recursiva. Pero bueno, cada uno programa como quiere.

Con "indice del array" a que te refierres? A la posicion del array donde estas o al valor que contiene esa posicion?

Si es la posicion, devuelve "ini" (que es el contador de la posicion actual del array, no?) y si es el contenido, que devuelva "s[ini]".

Un saludo
  #3 (permalink)  
Antiguo 27/05/2010, 12:12
 
Fecha de Ingreso: enero-2010
Mensajes: 21
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: [C++] Posición del menor de un array (forma recursiva)

Gracias por contestar, rantamplan87.
Sé que puede ser más eficiente hacer la función con un bucle, pero la cuestión es que necesito hacerla de forma recursiva.
A lo mejor no me he explicado muy bien ;)
Lo que necesito es que en vez de devolver el menor número del array (que es lo que hace el código que he escrito arriba). Me gustaría que devolviera el índice del array en el que se encuentra el menor número.
Si, como tú dices, devuelvo ini, al final de la recursividad devolvería 0, que es la primera posición.

Por ejemplo, suponiendo que el array fuese el siguiente:

Código C++:
Ver original
  1. int array[5];
  2.  
  3. array[0] = 5; array[1] = 3; array[2] = 1; array[3] = -9; array[4] = -5;
  4.  
  5. n = Menor(array, 0, 5);
  6.  
  7. cout << n << endl;

La función que yo he escrito te devolvería "-9", y necesito que devuelva "3", que es su posición dentro del array.
  #4 (permalink)  
Antiguo 27/05/2010, 13:48
 
Fecha de Ingreso: mayo-2010
Mensajes: 14
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: [C++] Posición del menor de un array (forma recursiva)

Ahora si te entiendo.

mmmm, se me ocurre alguna forma (muy rebuscada) de hacerlo.

Puedes hacer lo siguiente:

Reusando tu funcion "mayor" comparas la posicion s[ini] con el resultado de "mayor(s, ini+1, fin)". Si s[ini] es menor, devuelves 0, si es mayor, revuelves "1 + mayor(s, ini+1, fin)"

Algo asi:

Código:
int indiceMenor(int s[],int ini, fin)
{
 if(ini > fin)
     return 0;
else
{
  if (s[ini] < menor(s, ini+1, fin))
     return 0;
  else
     return 1 + indiceMenor(s, ini+1, fin)
}

}
No se si funcioara, pero no debe ir muy desencaminado

Un saludo
  #5 (permalink)  
Antiguo 28/05/2010, 11:13
 
Fecha de Ingreso: enero-2010
Mensajes: 21
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: [C++] Posición del menor de un array (forma recursiva)

Genial Rantamplán, ese código funciona de maravilla, muchas gracias
Sólo he tenido que poner las llamadas a la función con su nombre :P
El código al final ha quedado así:

Código C++:
Ver original
  1. int indiceMenor(int s[], int ini, int fin)
  2. {
  3.      if(ini > fin)
  4.      {
  5.           return 0;
  6.      }
  7.      else
  8.      {
  9.           if (s[ini] < indiceMenor(s, ini+1, fin))
  10.           {
  11.                return 0;
  12.           }
  13.           else
  14.           {
  15.                return (1 + indiceMenor(s, ini+1, fin));
  16.           }
  17.      }
  18. }

Aunque ayer por la noche me vino la inspiración divina y pude hacer el código a mi manera, aunque es bastante parecido y tiene el mismo resultado:

Código C++:
Ver original
  1. int Menor(int s[], int ini, int fin)
  2. {
  3.      int menor, dev;
  4.  
  5.      if(ini == fin)
  6.      {
  7.           dev = 0;
  8.      }
  9.      else
  10.      {
  11.           menor = Menor(s, ini + 1, fin);
  12.           if(s[ini] < s[menor])
  13.           {
  14.                dev = ini;
  15.           }
  16.           else
  17.           {
  18.                dev = menor;
  19.           }
  20.      }
  21.      return(dev);
  22. }

Ahora no sé por cuál decidirme :P
Un saludo y gracias, amigo.
  #6 (permalink)  
Antiguo 28/05/2010, 14:54
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: [C++] Posición del menor de un array (forma recursiva)

Creo que el ultimo codigo tiene un problema, pero no estoy seguro de ello.
Tal vez la observacion que hago sirve para que lo revises?

Código C++:
Ver original
  1. int Menor(int s[], int ini, int fin)
  2. {
  3.      int menor, dev;
  4.  
  5.      if(ini == fin)
  6.      {
  7.           // dev = 0;   // <-- codigo original
  8.           dev = ini; // <-- correccion
  9.      }
  10.      else
  11.      {
  12.           menor = Menor(s, ini + 1, fin);
  13.           if(s[ini] < s[menor])
  14.           {
  15.                dev = ini;
  16.           }
  17.           else
  18.           {
  19.                dev = menor;
  20.           }
  21.      }
  22.      return dev;
  23. }

Claro que aun asi alguien podria "perjudicarte" si invocara la funcion con parametros inadecuados, por ejemplo:

Menor( s, fin + 5, fin );
  #7 (permalink)  
Antiguo 29/05/2010, 10:18
 
Fecha de Ingreso: enero-2010
Mensajes: 21
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: [C++] Posición del menor de un array (forma recursiva)

Exactamente, CalgaryCorpus. Muchas gracias.
Probando la función al parecer funcionaba correctamente. Pero al añadirla a mi programa completo no conseguía los resultados esperados.
Con tu corrección he conseguido terminar satisfactoriamente.
Gracias de nuevo.

PD: En cuanto a la llamada "Menor(s , fin + 5, fin);" no se producirá porque en la función que llama a ésta, hago las comprobaciones necesarias ;)

Etiquetas: menor, formulario
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 18:44.