Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Fibonacci con potenze ricorsive

    Questo codice restituisce sempre 1, invece dovrebbe restituire un valore che varia in base ad n: un valore inserito dall'utente. Mi potete aiutare per risolvere il problema???

    AlgoritmiMatrici.identita(2);-->crea una matrice identità 2X2
    AlgoritmiMatrici.prodotto(a,b);-->esegue il prodotto tra due matrici a e b
    codice:
    public static int matrice1(int n)
      {
      	int idn[][]=AlgoritmiMatrici.identita(2);
      	int m[][]=idn;
      	
      	potenzamatrice(m, n-1);
      
      	return m[0][0];
      }
      public static void potenzamatrice(int[][] m, int n)
      {
        	if(n>1)
    	{
    		potenzamatrice(m, n/2);
    		m=AlgoritmiMatrici.prodotto(m,m);
    	}	
    	if(n%2==1)
    	{
    		int a[][]={{1,1},{1,0}};
    		m=AlgoritmiMatrici.prodotto(m,a);
    	}
     }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non so in che modo tu crei le matrici, ma non è quello il modo di procedere.
    In Java gli array sono oggetti. Se tu passi un oggetto ad un metodo, quello che fai è passare una copia del riferimento all'oggetto originale. Se poi, dentro al metodo "sostituisci" l'oggetto passato, non ottieni certo di "modificare" l'oggetto originario... semplicemente assegni alla variabile del metodo un nuovo riferimento.

    Quindi, in quel modo non funzionerà mai.

    Se vuoi poter modificare l'oggetto originario, l'unico modo è quello di far ritornare al metodo un nuovo riferimento e assegnare questo valore al vecchio riferimento.


    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
    In java se passi un array ad un metodo e, all'interno di esso, lo modifichi non ottieni che l'array originale viene anch'esso modificato? Al metodo viene passato il riferimento, non una copia del riferimento.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da 1_1_enrico_1_1
    In java se passi un array ad un metodo e, all'interno di esso, lo modifichi non ottieni che l'array originale viene anch'esso modificato?
    Sì, se modifichi l'oggetto, ma non se ne istanzi uno nuovo (ad esempio, con new() ).

    Al metodo viene passato il riferimento, non una copia del riferimento.
    Sbagliato, è esattamente il contrario.

    Vediamo, passo passo, cosa succede nel tuo codice.

    Per semplicità cambio i nomi dei parametri del metodo "potenzamatrice()":
    codice:
    public static void potenzamatrice(int[][] m1, int n1)
    {
       if(n1>1)
       {
          potenzamatrice(m1, n1/2);
          m1=AlgoritmiMatrici.prodotto(m1,m1);
       }	
       if(n1%2==1)
       {
          int a[][]={{1,1},{1,0}};
          m1=AlgoritmiMatrici.prodotto(m1,a);
       }
    }
    Andiamo a vedere che succede in memoria, passo per passo, durante l'esecuzione, guardando solo alle variabili che riguardano le matrici.

    codice:
    int idn[][] = AlgoritmiMatrici.identita(2);
    Situazione della memoria:
    idn --> 0x01

    0x01 è un numero a caso che indica una posizione in memoria.

    codice:
    int m[][] = idn;
    Situazione della memoria:
    idn --> 0x01;
    m --> 0x01;

    Anche "m" punta alla stessa posizione in memoria.

    codice:
    potenzamatrice(m, n-1);
    Situazione della memoria:
    idn --> 0x01;
    m --> 0x01;
    m1 --> 0x01;

    Anche m1 punta alla stessa posizione in memoria.

    codice:
    ... // potrebbero esserci delle chiamate ricorsive a potenzamatrice()
    m1 = AlgoritmiMatrici.prodotto(m1, m1);
    Situazione della memoria:
    idn --> 0x01;
    m --> 0x01;
    m1 --> 0x02;

    Quando il metodo termina, il parametro m1 punta ad una matrice diversa... ma le variabili originarie (m e idn) continuano a puntare alla stessa identica matrice di prima.
    Se AlgoritmiMatrici.prodotto() non modifica la matrice in ingresso, ma ne costruisce una nuova, le variabili di partenza ( quelle del metodo matrice1() ) continueranno a vedere gli stessi identici dati di partenza.


    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
    Ho capito
    Provando a restituire il valore il risultato non cambia

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.