Stack Overflow, passo ricorsvio

di il
8 risposte

Stack Overflow, passo ricorsvio

L'esercizio deve restituire false se l'elemento x è presente nell'array
deve restituire true se non è presente..

la parte che restituisce false funziona, se l'elemento x è presente nell'array non da problemi,
ma se tutti gli elementi sono diversi dall'elemento inserito non funziona

 public static boolean Ricorsione(int[] a,int i,int x) {
        
        if(a.length==0) { //caso base array vuoto
            return true; //x non è presente per forza nell'array a
        }
         if(a[i]!=x) {
            return Ricorsione(a,i,x);
        } else {
            return false;
        }
   
        }
        
        nel main dopo aver inserito l'array in input
         System.out.println(Ricorsione(a,0,2));

8 Risposte

  • Re: Stack Overflow, passo ricorsvio

    KernelPanic ha scritto:


    ma se tutti gli elementi sono diversi dall'elemento inserito non funziona
    Se quando invochi ricorsivamente il Ricorsione gli passi Ricorsione(a,i,x) così sostanzialmente NON lo stai facendo andare avanti!
    Alla iniziale invocazione esplicita gli passi 0, alla prima invocazione ricorsiva gli devi passare 1, ecc..

    Questo comporta un'altra questione: quando è che termini la ricorsione? Non (solo) quando l'array è vuoto (la lunghezza dell'array NON cambia nelle varie ricorsioni!). In sostanza, devi cambiare il test iniziale ...
  • Re: Stack Overflow, passo ricorsvio

    Però comunque anche e in boolean Ricorsione gli passo solo(int[] a, int x)
    devo definire un contatore che mi conta e confronta le posizioni di a,
    anche se definisco questa variabile int i =0; al di fuori dei parametri iniziali che gli passo
    va lo stesso in stack overflow
    anche perché se la variabile i=0; è fissa a zero non rimane ferma su quel valore?
    
            int i=0;
            if(a.length==0) { //caso base array vuoto
                return true; //x non è presente per forza nell'array a
            }
             if(a[i]!=x) {
                return Ricorsione(a,x);
            } else {
      
                 return false;
            }
       
            }
            
  • Re: Stack Overflow, passo ricorsvio

    KernelPanic ha scritto:


    Però comunque anche e in boolean Ricorsione gli passo solo(int[] a, int x)
    devo definire un contatore che mi conta e confronta le posizioni di a,
    anche se definisco questa variabile int i =0; al di fuori dei parametri iniziali che gli passo
    va lo stesso in stack overflow
    anche perché se la variabile i=0; è fissa a zero non rimane ferma su quel valore?
    Non ci siamo. Allora ...

    Se la forma fosse metodo(int[] a, int x)
    allora ad ogni invocazione ricorsiva dovresti passare un array più piccolo. Se alla prima invocazione non ricorsiva passi {4,9,3,2}, alla prima ricorsione passi un nuovo array {9,3,2} poi ancora ricorsivamente {3,2} ecc....

    Se invece la forma è metodo(int[] a, int indice, int x)
    allora è l'indice che si DEVE incrementare ricorsivamente.

    Stop, è tutta qui la questione.
  • Re: Stack Overflow, passo ricorsvio

    andbin ha scritto:



    Se invece la forma è metodo(int[] a, int indice, int x)
    allora è l'indice che si DEVE incrementare ricorsivamente.

    Stop, è tutta qui la questione.
    ok ci sono quasi...
    scusami ma sono ai primi passi con la ricorsione provo anche a fare su carta ma devo ancora entrare bene nel meccanismo..
    
        if(a.length==0) { //caso base array vuoto
                return true; //x non è presente per forza nell'array a
            }
             if(a[i]!=x) {
                return Ricorsione(a,++i,x);
            } else {
      
                 return false;
            }
       
            }
    
    nel passo ricorsivo incremento (prima ++i) ma comunque non mi da l'errore di stack overflow ma mi esce proprio fuori dall'array
  • Re: Stack Overflow, passo ricorsvio

    KernelPanic ha scritto:


    non mi da l'errore di stack overflow ma mi esce proprio fuori dall'array
    Ovviamente devi fare un controllo. L'array è sempre lo stesso identico nelle varie invocazioni ricorsive. E' solo l'indice che si incrementa. Quindi pensa, QUANDO devi terminare la ricorsione?
  • Re: Stack Overflow, passo ricorsvio

    andbin ha scritto:


    Ovviamente devi fare un controllo. L'array è sempre lo stesso identico nelle varie invocazioni ricorsive. E' solo l'indice che si incrementa. Quindi pensa, QUANDO devi terminare la ricorsione?
    La ricorsione la devo terminare quando appunto il controllo di tutte le posizioni dell'array è stato effettuato,
    ma come faccio a dirgli che deve terminare?
    se faccio ++i incrementa sempre e va avanti, e dopo esce dall'array
    se faccio i non fa nulla,
    ho aggiunto questa condizione ma comunque non mi sembra molto sensata come controllo (a parte che non funziona) che stampa solo false..
    ma non saprei in che altro modo fare
    
    if(a.length==0) { //caso base array vuoto
                return true; //x non è presente per forza nell'array a
            }
             if(a[i]!=x && a[i] < a.length) {        //ho aggiunto questa condizione 
                return Ricorsione(a,i++,x);
                 
             }  else {
                 return false;
            
             }
             
  • Re: Stack Overflow, passo ricorsvio

    AL CONTRARIO, la UNA CONDIZIONE DEL GENERE E' ASSOLUTAMENTE SENSATA!

    La TUA CONDIZIONE e' SBAGLIATA, ma ci sei andato vicino e l'errore e' facilmente risolvibile!

    RAGIONA: "i" e' una posizione nell'array e puo' valere SOLO i valori 0,1,2,L-1 DOVE "L" e' la lunghezza dell'array.

    QUINDI, devi fare i seguenti controlli:

    1) hai gia' raggiunto la FINE dell'array? E questo lo sai confrontando "i" con la LUNGHEZZA dello stesso
    2) SE non hai raggiunto la fine dell'array, ALLORA l'elemento i-mo E' UGUALE all'element che stai cercando?
    se SI fai una cosa
    se NO ne fai un'altra

    OSSERVA che il test 1) COMPRENDE il TUO TEST sulla lunghezza dell'array!

    Ovviamente ci devi RAGIONARE
  • Re: Stack Overflow, passo ricorsvio

    KernelPanic ha scritto:


             if(a[i]!=x && a[i] < a.length) {        //ho aggiunto questa condizione 
    Scritto così no. La lunghezza dell'array NON la puoi certo confrontare con a[i] (uno dei valori!)
    E in ogni caso non andrebbe bene come secondo operando del &&

    Hai scritto il test iniziale if(a.length==0)
    Bene, GENERALIZZALO con l'indice.

    Se ad una invocazione (ricorsiva o non che sia) hai:

    indice 0, lunghezza 0, cosa fai?
    indice 4, lunghezza 4, cosa fai?

Devi accedere o registrarti per scrivere nel forum
8 risposte