Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [java] contatore ricorsivo

    Buongiorno e felice estate a tutti.
    Dunque..ho realizzato un contatore ricorsivo non funzionante dovrebbe restituire un numero di quanti numeri sono presenti nell'array maggiori di 50 ma restituisce 0

    2 domande:
    perche restituisce zero?
    e come fare per correggerlo?

    codice:
    class ArrayMaggiore{
      public static void main(String[] args){
        int[] array = {10,20,30,40,50,60,70,80,90,100};
    
        System.out.println( countGreater(array, 50) );
      }
    
      public static int countGreater(int[] A, int x){
        return ric(A,x,0,0);
      }
    
      public static int ric(int[] A, int x, int ini, int cont){
        if(ini<A.length){
          if(A[ini]<x) ric(A,x,ini+1,cont);
          if(A[ini]>x) ric(A,x,ini+1,cont+1);
        }
        return cont;
      }
    
    }

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    In java gli argomenti sono passati per valore, quindi cont resta immodificato all'uscita della chiamata ricorsiva ric(A,x,ini+1,cont); visto che ric ritorna proprio il valore cont basta fare:

    codice:
      public static int ric(int[] A, int x, int ini, int cont){
        if(ini<A.length){
          if(A[ini]<=x)
               cont = ric(A,x,ini+1,cont);
          if(A[ini]>x)
               cont = ric(A,x,ini+1,cont+1);
        }
        return cont;
      }

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ...secondo te Anx cosi è fatto bene? Tu l'avresti fatto in altro modo?

    è esatto che si aprono sullo stack le varie chiamate ric. e poi si chiudono una per una?

    cioè non c'è modo che all'ultima chiamata ricorsiva si restituisca al chiamante il valore cont...ma cont torna indietro fra le varie chiamate aperte...forse a questo punto si poteva non mettere cont come parametro?

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    E' giusto che le chiamate ricorsive si accumulino nello stack una dopo l'altra e poi si risalga su nello stack delle chiamate, è proprio cosi che funzione la ricorsione. Il parametro cont in effetti non è necessario perche non può essere modificato dalla funzione, a meno che non sia un campo di classe (static, visto che il metodo è static), ma è meglio non utilizzare un campo della classe.

    Così dovrebbe funzionare uguale:


    codice:
    public static int ric(int[] A, int x, int ini){
         if(ini >= A.length)
              retrun 0;
          if(A[ini] > x)
               return 1 + ric(A, x, ini + 1);
          else
               return ric(A, x, ini + 1);
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Si..funxiona! molto bravo, grazie

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.