Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: La ricorsione in java

  1. #1

    La ricorsione in java

    Qualcuno è così gentile da spiegarmi al volo la ricorsione?

    Mille grazie,
    Piero.


  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    La Ricorsione si attua quando una funzione richiama se stessa per produrre il risultato. La chiamata avviene passando dei parametri "più semplici", in modo da raggiungere il caso base, che rappresenta il caso più semplice in assoluto.

    Facciamo un esempio classico, il calcolo del fattoriale: in matematica il fattoriale è definito ricorsivamente come segue
    codice:
    Fattoriale(0) = 1
    Fattoriale (X) = X * Fattoriale(X - 1)
    Vediamo di codificarlo in Java:
    codice:
    int fattoriale(int x) {
       int risultato = 0;
       if (x == 0) {   // caso base
          risultato = 1;
       } else {   // caso ricorsivo
          risultato = x * fattoriale(x-1);
       }
       return risultato;
    }
    La ricorsione, però, può non essere sempre singola... può capitare il caso di una doppia ricorsione. E' il caso del calcolo della serie di fibonacci, definita come segue (in una delle 2 varianti)
    codice:
    Fibonacci(0) = 1
    Fibonacci(1) = 1
    Fibonacci(X) = Fibonacci(x-1) + Fibonacci(x-2);
    Vediamolo in Java:
    codice:
    int fibonacci(int x) {
       int risultato = 0;
       if ((x == 0) || (x == 1)) {   // casi base
          risultato = 1;
       } else {   // caso ricorsivo
          risultato = fibonacci(x-1) + fibonacci(x-2);
       }
       return risultato;
    }
    Ci sono poi casi di risorsione nella ricorsione... è il caso della funzione di Ackerman
    codice:
    Ack(0, n) = n + 1 
    Ack(m+1, 0) = Ack(m, 1) 
    Ack(m+1, n+1) = Ack(m, Ack(m+1, n))
    In Java:
    codice:
    int Ack(int x, int y) {
       int risultato = 0;
       if (x == 0) {   // caso base
          risultato = y + 1;
       } else {   
          if (y == 0) {   // 1° caso ricorsivo
             risultato = Ack(x-1, 1);
          } else {  // 2° caso ricorsivo
             risultato = Ack(x-1, Ack(x, y-1));
          }
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie capitano!

    Sei stato molto chiaro, peccato che sono gli stessi identici esempi che ho io sul libro...
    Cercavo qualcosa di diverso, comunque grazie mille davvero.



  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Pronti qua... vediamo di creare una funzione ricorsiva che, presa una stringa, ritorna la stringa inversa (con tutti i caratteri invertiti, esempio "Ciao" --> "oaiC"):
    codice:
    public String inverti(String stringa) {
       return "" + stringa.charAt(stringa.length()-1) +
              inverti(stringa.substring(0, stringa.length()-1));
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Altro esempio... calcoliamo il determinante di una matrice di ordine qualsiasi:
    codice:
    public long det (int [][] matrice, int ordine) {
       long risultato = 0;
       int [][] nuova;
       int pos;
    	
       if (ordine == 2)
          risultato = matrice[0][0] * matrice[1][1] - matrice[0][1] * matrice[1][0];
       else {
          nuova = new int[ordine-1][ordine-1];
          for (int k=0; k<ordine;k++) {
             for (int i=1; i<ordine; i++) {
                pos = 0;
                for (int j=0; j<ordine; j++)
                   if (j != k) {
                      nuova[i-1][pos] = matrice[i][j];
                      pos++;
                   }
             }
    
             if ((k % 2) == 0)
                risultato = risultato + matrice[0][k] * det(nuova, (ordine-1));
             else
                risultato = risultato - matrice[0][k] * det(nuova, (ordine-1));
          }
       }
    
       return risultato;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6


    Velocissimo! Grazie mille di nuovo. Mo stampo... e porto a casa.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Prova ad inventartene qualcuna anche tu... anche di stupidaggini, come calcolare la somma di tutti i valori contenuti in nu array in modo ricorsivo...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    18
    Il metodo per l'inversione della stringa è errato...manca il caso base un fondamento della programmazione ricorsiva.
    Va aggiunto if(stringa.length()==0)return "";

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da mr87
    Il metodo per l'inversione della stringa è errato...manca il caso base un fondamento della programmazione ricorsiva.
    Va aggiunto if(stringa.length()==0)return "";
    E' un thread del 2004 !!! L'hai visto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2006
    Messaggi
    18
    Certo..che domande. Era per chi dovesse visitare la pagina in futuro. Meglio lasciare il codice incorretto?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.