2011-04-08 12 views
5

Ok, así que he estado tratando de concentrarme en la recursión en Java y puedo realizar tareas sencillas como suma, inversión, etc. pero he estado luchando para hacer este ejercicio:¿Encontrar el mínimo de una matriz usando la recursión?

Estoy intentando encuentre el número mínimo en una matriz usando la recursión, pero continúe obteniendo una respuesta de 0.0.

Mi comprensión para la recursión es que necesito incrementar un elemento y luego proporcionar un caso base que terminará la recursión. Creo que estoy cometiendo un error cuando tengo que devolver un valor y cuándo es mejor llamar al método de recursión.

Esto es lo que tengo hasta ahora:

public static double findMin(double[] numbers, int startIndex, int endIndex) { 

double min; 
int currentIndex = startIndex++; 

if (startIndex == endIndex) 
    return numbers[startIndex]; 

else { 
    min = numbers[startIndex]; 
    if (min > numbers[currentIndex]) { 
     min = numbers[currentIndex]; 
     findMin(numbers, currentIndex, endIndex); 
    } 
      return min; 
}  
} //findMin 

Respuesta

4

Hay una variedad de problemas en este código, incluyendo:

  • No utiliza el resultado de la llamada recursiva findMin.
  • startIndex será el mismo para cada llamada a findMin, porque currentIndex se está estableciendo con el valor de startIndexantesstartIndex se incrementa.
  • Si el número en el índice 1 en la matriz es < = el número en el índice 0, simplemente devuelve ese número sin siquiera hacer la llamada recursiva.
+0

Entonces, ¿la declaración de devolución debe ocurrir antes de llamar al método recursivo findMin? Además, no entiendo cómo el startIndex no está cambiando. Cuando llamo al método recursivo findMin, estoy usando los parámetros con currentIndex (en lugar de startIndex), que luego debería pasar como un nuevo startIndex, ¿correcto? Creo que estoy empezando a confundirme :( – Vance

+0

@ user699302: el problema es 'currentIndex = startIndex ++'. Cuando 'startIndex' es 0,' currentIndex' se convierte en 0 y 'startIndex' se convierte en 1. Cuando se invoca' findMin' , lo pasa 'currentIndex', por lo que en esa llamada' startIndex' volverá a ser 0, lo que dará lugar a una recursión infinita y un desbordamiento de la pila. – ColinD

5

Consejo: Usted está llamando findMin de forma recursiva, pero luego no usar su valor de retorno.

¿Cuál es la relación entre (1) el mínimo de toda la matriz, (2) el primer elemento y (3) el mínimo de todo aparte del primer elemento?

+0

Por lo tanto, debería llamar al método findMin de forma recursiva y asignar el valor devuelto a ...? Aquí es donde estoy confundido. ¿Defino el valor de retorno antes de llamar al método findMin? – Vance

1

algunas observaciones, además de la primera respuesta:

  • int currentIndex = startIndex++; - que van a perder su primer elemento aquí. En general, no desea modificar la entrada a su función recursiva. Trabajar fuera de la entrada y generar nuevos valores cuando esté listo para llamar a la función de nuevo - es decir, 'findMin (números, currentIndex + 1, endIndex)'
+0

El valor predeterminado de un "doble" no entra para jugar aquí, ya que 'min' siempre se asigna a un valor de la matriz antes de que se lea. Realmente, no debería declararse hasta el punto donde está asignado. – ColinD

+0

Vaya, error mío, leí mal la ubicación del min. gracias – dfb

6

Aquí hay una versión simplificada:

public static double min(double[] elements, int index) { 

    if (index == elements.length - 1) { 
    return elements[index]; 
    } 

    double val = min(elements, index + 1); 

    if (elements[index] < val) 
    return elements[index]; 
    else 
    return val; 
} 
Cuestiones relacionadas