Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 27

Discussione: [c]fibonacci

  1. #11
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da spode
    l'errore che mi dà il pc? allegato! allegato!
    Non metterò MAI in esecuzione il tuo exe. MAI. xD

    il codice aggiornato, ma sempre non funzionante...
    codice:
    i=prepreced+preced;
    preced=i;
    prepreced=preced;
    In questo modo, sia preced che prepreced (nomi orrendi, btw), prendono il valore di i.

    codice:
    temp = preced + prepreced;
    prepreced = preced;
    preced = temp;
    Questo è lo scambio corretto.

    Cos'hai che non va coi cicli for? Ad occhio mi viene da pensare che non funzioni quando scrivi
    codice:
     for (int i = 0; i < x; i++);
    giusto? Questo probabilmente perchè con dev-c++ scrivevi automaticamente in C++, mentre con CodeBlocks avrai aperto un progetto in C dove quella sintassi è scorretta, non puoi dichiarare la variabile nel ciclo for.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #12
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da simo_us
    Comunque ritornando alla funzione che ti ho scritto come prima risposta, é leggermente sbagliata, con una piccola correzione
    codice:
    int fibo(int fb)
    {
       if(fb == 0 || fb == 1)
          return fb;
       else
          return fibo(fb-1) + fibo(fb-2);
    }
    é decisamente meglio.
    Mmm... si, è più matematica, ma per numeri grandi è alcune migliaia di volte più lenta della versione iterativa... non sono un grande fan di quella ricorsiva, a meno che non si inserisca un vettore di valori precalcolati...
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #13
    ma per numeri grandi è alcune migliaia di volte più lenta della versione iterativa..
    Eh si Ho scritto un attimo questa funzione
    codice:
    void fibo(int N)
    {
       long x, fb_2 = 1, fb_1 = 2, tmp, fb;
       
       for(x = 0; x < N; x++)
       {
          if((x == 0 || x == 1) || x <= 2)
             fb = x;
          else
          {
             fb = fb_2 + fb_1;
             tmp = fb_1;
             fb_1 = fb;
             fb_2 = tmp;
          }
          printf("%d\n", fb);
       }
    }
    E con l'altra quasi puoi farti un caffé ed una sigaretta se l'argomento é = 50 circa..

  4. #14
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Volendo c'è un'alternativa... praticamente la versione ricorsiva è più lenta perchè ricalcola ogni volta un sacco di valori senza mai salvarli. Un'idea sarebbe quella di salvare i valori precalcolati per non doverli rifare ogni volta:

    codice:
    unsigned long vals[50] = {1, 1};
    
    unsigned long fib(int n)
    {
        if (n == 0 || n == 1)
            return 1;
    
        if (vals[n] > -1)
            return vals[n];
        else
        {
            vals[n] = fib(n-1) + fib(n - 2);
            return vals[n];
        }
    }
    Però nemmeno così regge il confronto con quelle iterative...
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #15
    Però nemmeno così regge il confronto con quelle iterative
    Si non c'é paragone..
    codice:
    time fibonacci(40) /* funzione ricorsiva scritta prima */
    
    real	0m0.001s
    user	0m0.000s
    sys	0m0.000s

  6. #16
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Ippo343
    Volendo c'è un'alternativa... praticamente la versione ricorsiva è più lenta perchè ricalcola ogni volta un sacco di valori senza mai salvarli. Un'idea sarebbe quella di salvare i valori precalcolati per non doverli rifare ogni volta:
    Oltre a dover ricalcolare diverse volte gli stessi valori c'è da tener conto dell'overhead dovuto alla creazione dei record di attivazione!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #17
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    ALT!
    stiamo uscendo un po' fuori campo e non ci sto capendo niente!
    dov'è che devo migliorare quel codice? neanche questo va bene...

    TRACCIA: visualizzare n termini, con n intero positivo fornito in ingresso, della successione di fibonacci.suggerimento: nella successione di fibonacci i primi 2 termini sono 0 e 1, quelli successivi sono 1,2,3,5,...: ogni termine si ricava addizionando i due precedenti.

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    
    main(){
           int prepreced,preced,i=0,numero,fibo;
           static int app;
           do{
           printf("ATTENZIONE: INSERIRE NUMERI ALTI NON FA BENE AL PC...\2\nInserisci n:");
           scanf("%d",&numero);} while(numero<1);
    
           prepreced=0;preced=1;
           do       {
                        i=prepreced+preced; //1=0+1 2=1+1
                        prepreced=preced; //0=1 1=1
                        preced=i; //1=1 1=2
                        } while(i>=numero);
                        printf("I numeri prima del numero inserito sono %d nella successione di Fibonacci\n",i);
    
           printf("Premi \"X\" in alto a destra per uscire!\n\n");
           main();
           } // 2+3=5 3+5=8     5+8=13
            // prepre+pre=i pre+i=i prepre+i=i
    mi fareste capire l'errore? stavolta prepreced o preced non sono uguali a i, vero?

  8. #18
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Ok, stavolta lo scambio è giusto, però rimane che quel ciclo ha una condizione sbagliata. "i" conterrà l'n-esimo numero della sequenza, e non n.

    Inoltre è sbagliata la condizione del ciclo... Lascia stare il ciclo while: usa un ciclo for. La variabile di controllo del ciclo deve essere usata solo per quella: per i calcoli usane altre, ok?

    Comunque, il metodo più semplice è ancora usare la funzione ricorsiva che è stata postata più sopra, anche se è sicuramente il meno efficiente.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  9. #19
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da Alex'87
    Oltre a dover ricalcolare diverse volte gli stessi valori c'è da tener conto dell'overhead dovuto alla creazione dei record di attivazione!
    Vero, ma basta avanzare anche poco nella serie perchè questo overhead sia trascurabile rispetto a quello causato dalla ripetizione dei calcoli.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  10. #20
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    Originariamente inviato da simo_us
    Si non c'é paragone..
    codice:
    time fibonacci(40) /* funzione ricorsiva scritta prima */
    
    real	0m0.001s
    user	0m0.000s
    sys	0m0.000s
    non ho ancora mai usato questo richiamo ricorsivo, dato che non lo avevo mai visto. ora però non so a che serve...

    Cos'hai che non va coi cicli for? Ad occhio mi viene da pensare che non funzioni quando scrivi
    codice:

    for (int i = 0; i < x; i++);


    giusto? Questo probabilmente perchè con dev-c++ scrivevi automaticamente in C++, mentre con CodeBlocks avrai aperto un progetto in C dove quella sintassi è scorretta, non puoi dichiarare la variabile nel ciclo for.
    io non so programmare in c++, dato che in c sto ancora bloccato ai primi capitoli e non intendo andare avanti finchè non avrò aggiustato logica, funzioni e fatto tutti gli esercizi!
    SO: Windows 7

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