Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2014
    Messaggi
    12

    [JAVA]calcolo della lunghezza di una sequenza di elementi con metodo RICORSIVO

    salve ragazzi, devo implementare un metodo ricorsivo per il calcolo della lunghezza di una sequenza di elementi e l'ho impostato così:

    codice:
    public static int lunghezza (String[] s, int i) {
    		if(s[i]==null)return 0;
    		else return lunghezza (s,i++);
    		
    	}
    
    	public static void main(String[] args) {
    		String[] s={"34567878"};
    		System.out.println(lung(s, 0));
    	
    		
    	}
    }
    mi da il seguente errore: Exception in thread "main" java.lang.StackOverflowError.
    grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Quote Originariamente inviata da Leafeon Visualizza il messaggio
    mi da il seguente errore: Exception in thread "main" java.lang.StackOverflowError.
    grazie in anticipo
    Stai cercando un elemento null per terminare ... ma non c'è nel tuo array di prova. E comunque la ricorsione dovrebbe terminare, a rigor di logica, quando non hai più elementi nell'array (non quando un elemento è null ... al massimo lo puoi ignorare).
    E comunque, ancora, non hai calcolato un bel niente. Vuoi sommare le lunghezze delle stringhe? (quindi es. {"aa", "bbb"} darebbe 5). E dove è questo calcolo nel tuo codice?

    O vuoi il numero di elementi nell'array? (la ricorsione per questo??)
    Ultima modifica di andbin; 08-09-2014 a 23:34
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Quote Originariamente inviata da Leafeon Visualizza il messaggio
    mi da il seguente errore: Exception in thread "main" java.lang.StackOverflowError.
    Principalmente perché i++ passa al metodo lo stesso valore di i e poi solo dopo lo incrementa. Questo, oltre al fatto che cerchi un null (molto dubbio) è il motivo per cui esaurisce lo stack.

    Comunque, come ho detto prima, precisa bene cosa vuoi calcolare, perché fino ad adesso non hai determinato nulla.

    P.S. vedo ora che nel main la invocazione l'hai fatta con lung mentre il metodo è chiaramente lunghezza.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Quando utilizzi la ricorsione assicurati di scrivere correttamente i passi base. Se non li scrivi o li scrivi in modo sbagliato il tuo algoritmo non terminerà, quindi otterrai una bella "StackOverflowError".

    Per scrivere il passo base, pensa sempre che nella ricorsione miri ad eseguire il tuo calcolo ad un problema sempre più piccolo ad ogni chiamata ricorsiva. Il problema più piccolo in assoluto è il tuo passo base.

    In questo caso il problema più piccolo in assoluto è la stringa assente, cioè lunga 0. Questo è il primo controllo che fai.

    Quindi:

    codice:
    // i è l'indice che utilizzi per scorrere la parola
    // e se risulta uguale alla lunghezza della parola,
    // alla prima chiamata della funzione esce subito
    // ritornando la lunghezza 0, altrimenti se entra
    // in questo if in una chiamata successiva, non 
    // somma nulla alla lunghezza calcolata fino a quel
    // momento 
    if(i == parola.length()) {
        return 0;
    }
    // dopo il passo base in genere avviene la chiamata ricorsiva
    else {
        // in sostanza sommi 1 alle successive chiamate ricorsive
        // che devono avvenire sempre incrementando l'indice i
        return 1 + lunghezza(parola, i + 1);
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.