ayuda con recursividad
Bueno amigos el caso es que estoy viendo recursividad (en esta caso cadeas), tengo que calcular la longitud de una cadena, logicamente parece que esta bien pero no se donde esta el error, me pueden ayudar?
import java.io.*;
import java.util.*;
public class Prueba {
public int longi(String cad,int pos) {
//int ad=cad.length();
if (cad.charAt(pos)!='\0') {
return longi(cad, pos+1);
} else {
return pos;
}
}
public static void main( String args[] ) {
String s = new String( "hello" );
Prueba obj=new Prueba();
// System.out.println(""+obj.longi(s,0));
obj.longi(s,0);
System.exit( 0 );
}
}
El error que me marca es
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
GRACIAS
- Inicie sesión o regístrese para enviar comentarios
Ahhh pues es que eso es lo
Ahhh pues es que eso es lo que pasa cuado copias código así nomás sin entenderlo ni nada.
Lo que copiaste funcionaba en C donde las cadenas terminan con el caracter
'\0'
pero en Java esto no tiene sentido entonces el método sigue llamandosé así mismo aún más allá de su límite. Como la cadena "hello" mide 5 caracteres y tu intentas acceder a la 6ta ( en Java la primera posición es la 0, la segunda la 1 etc. )Quizá necesites otro ejemplo porque en Java la longitud de una cadena se obtiene con el método "length()" y no hay forma de crear una condición que haga sentido para detener la recursividad.
Lo que podrías hacer es una función recursiva para buscar algún caracter:
public int indexOf( String string , char c, int currentPosition ) {
//Primero hay que establecer las condiciones de salida:
// Si la cadena es nula, regresamos -1, no encontrado.
if ( string == null ) {
return NOT_FOUND;
}
// Si la cadena es vacía, regresamo -1 , no encontrado
if ( string.equals("") ) {
return NOT_FOUND;
}
// Luego vemos si ya excedimos el límite ( por ejemplo si la cadena mide 5 y ya estamos en el 6to )
if ( currentPosition >= string.length() ) {
return NOT_FOUND;
}
// Finalmente ya podemos revisar si ya encontramos el caracter
if ( string.charAt( currentPosition ) == c ) {
return currentPosition;
}
// Si no fue ninguna entonces busca recursivamente:
return indexOf( string, c, currentPosition + 1 );
}
También se puede escribir las condiciones donde no se encuentra en una sola sentencia. Aquí va el ejemplo completo:
class EjemploRecursivo {
public static final int NOT_FOUND = -1;
public int indexOf( String string , char c, int currentPosition ) {
// Si la cadena es nula o vacía o ya nos pasamos del límite
// entonces regresamos -1, no encontrado.
if ( string == null || string.equals("") || currentPosition >= string.length()) {
return NOT_FOUND;
}
// Podemos tambien usar el operador ternario: cond ? siDaTrue : siDaFalse
return string.charAt( currentPosition ) == c ? currentPosition : indexOf( string, c, currentPosition +1 );
}
// probarlo
public static void main( String ... args ) {
EjemploRecursivo ejemplo = new EjemploRecursivo();
System.out.println( ejemplo.indexOf( "hello", 'l', 0 )); // regresa 2, porque esa es la primera posición de 'l'
}
}
También se puede abusar del operador ternario y ponerlo todo en una sola expresion:
public static final int NOT_FOUND = -1;
public int indexOf( String string , char c, int currentPosition ) {
return string == null
|| string.equals("")
|| currentPosition >= string.length()
? NOT_FOUND
: string.charAt( currentPosition ) == c
? currentPosition
: indexOf( string, c, currentPosition +1 );
}
// probarlo
public static void main( String ... args ) {
EjemploRecursivo ejemplo = new EjemploRecursivo();
System.out.println( ejemplo.indexOf( "hello", 'l', 0 )); // regresa 2, porque esa es la primera posición de 'l'
}
}
Pero ya se hace menos legíble :)
Aquí te dejo un link para leer más al respecto: Para entender la recursividad, primero hay que entender la recursividad
gracias oscar
Pues si es que primero aprendi c y pues se como java esta basado en c, dije a de ser lo mismo, pero gracias por tomarte tu timpo y responder y sobre todo poner el link de la recusividad, saludos
Ah vaya... creí que habías
Ah vaya... creí que habías encontrado en Google algo y que le habías hecho copy/paste y ya, sin tratar de entenderlo.
Pero sí, esa es una diferencia entre Java y C que al principio parece algo molesta y luego ya ni te acuerdas de ella.