Sequenza di Fibonacci

di il
12 risposte

Sequenza di Fibonacci

Ragazzi, per esercizio mi sono messo a creare un algoritmo che scriva i primi n numeri della sequenza di fibonacci nel minor numero di righe possibile, prendendo n da riga di comando. Come vi sembra questo tentativo?

    #include <stdio.h>
     
    int main(int argc, char *argv[]){
    int prox, cont=0, y;
    int j[2];
     
    j[0]=(j[1]=cont)+1;
     
            for(y=0;y<atoi(argv[1]);y++){
                    printf("%d\n", prox=j[0]+j[1]);
                    j[0]=j[1];
                    j[1]=prox;
            }      
    }

12 Risposte

  • Re: Sequenza di Fibonacci

    Ciao,
    Bello! Ti do una spuntatina giusto per divertirci
    
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        unsigned long long prox, y, j[]={1,0};
    
        for (y = atoi(argv[1]); y-- ; j[0]=j[1],j[1]=prox)
            printf("%llu\n", prox=j[0]+j[1]);
    
        return 0;
    }
    
    Edit: meglio il long long dell' int
  • Re: Sequenza di Fibonacci

    Ciao ragazzi,
    oh che bello si gioca! ora tocca a me:
    
     #include <stdio.h>
    
    void Fibonacci(int n)     
    {
    	for(int a=1, b=1, c=2; n--; printf("%d\n", a), a=b, b=c, c=a+b);
    }
    
    int main()
    {
    	Fibonacci(10);
    	return 0;
    }
    
    Ho il codice in una funzione che mi sembra più bello.
  • Re: Sequenza di Fibonacci

    Edit: meglio il long long dell' int
    Si, in effetti...
    Barba59, il tuo è davvero corto! Anche se sincerament non ho capito molto bene l'uso che fai del ciclo for()...
  • Re: Sequenza di Fibonacci

    barba59 ha scritto:


    Ciao ragazzi,
    oh che bello si gioca! ora tocca a me:
    Puntale come un orologio svizzero!

    Riconosco che è veramente compatta, non voglio cercar di togliere bytes al codice (anche perché sarebbe dura) ma proporre una macro recursiva
    
    #define F( N )  \
        (((N)<1) ? 0 : ((N) == 1) ? 1 : F( N - 1 ) + F( N - 2 ))
    
    che ovviamente non compila ( ) .... ma in fondo in fondo hai ragione non potrebbe!

    per cui:
    
    unsigned long long f(int n)
    {
        return (n<1)?0:(n==1)?1:f(n-1)+f(n-2);
    }
    
    Non è più corta ma è un'alternativa...

    buona notte a barba59 e web_pirate domani giornata dura al lavoro!
  • Re: Sequenza di Fibonacci

    He, he ciao ixamit, lo sapevo che il gioco non finiva li, e stavo aspettando la tua risposta. Arrivati ad una riga si può cercare di farla più corta, l' idea della ricorsione è buona.

    Ecco qua:
    
    #include <stdio.h>
    
    void f(int n, int a, int b)
    {
    	n--?printf("%d\n",a),f(n,b,a+b):0;
    }
    
    int main()
    {
    	f(10, 1, 1);
    	return 0;
    }
    
    Ciao web_pirate, le spiegazioni (se servono) alla fine del gioco.

    P.S. Non ci sarò per qualche giorno vado in Svizzera, la battuta di ixamit cade a proposito.
  • Re: Sequenza di Fibonacci

    
    # Python
    Precedenti = { 0:1, 1:1 }
    
    def Fibonacci(n):
       if Precedenti.has_key(n):
          return Precedenti[n]
       else:
          NuovoValore = Fibonacci(n-1) + Fibonacci(n-2)
          Prededenti[n] = NuovoValore
          return NuovoValore
    
    Questo codice l'ho trovato nella guida di Python, mi e' piaciuto perche' non sviluppa ulteriormente i rami precedenti della serie se non strettamente necessari riducendo parecchio l'uso di memoria delegando una variabile la memorizzazione dei risultati precedenti.
  • Re: Sequenza di Fibonacci

    barba59 ha scritto:


    
    #include <stdio.h>
    
    void f(int n, int a, int b)
    {
    	n--?printf("%d\n",a),f(n,b,a+b):0;
    }
    
    La mia idea era buona ma l'hai già condensata al limite del possibile prima che potessi controbattere (e ci ho anche provato... ).
    Come vedi sono proprio all'osso...comunque è quella che mi è piaciuta di più

    L'unica proposta da ripresentare funziona su coppie e partendo dalla tua precedente (quella non ricorsiva), possiamo togliere una variabile e dimezzare i cicli.

    barba59 ha scritto:


    
    void Fibonacci(int n)     
    {
       for(int a=1, b=1, c=2; n--; printf("%d\n", a), a=b, b=c, c=a+b);
    }
    
    
    void f(int n)
    {
        /* pair */
        unsigned long long a=1, b=1;
        for(; n--; printf("%llu\n%llu\n", a,b), a+=b, b+=a);
    }
    
    @Lysz210, non conosco python ti allego una in bash:
    
    fibonacci ()
    {
        local n=$1
        local o=0
        local b=1;
        for ((;n--;))
        do
            echo $a
            c=$((a+b))
            a=$b
            b=$c
        done
    }
    
    Leggi le definizioni delle variabili in verticale
  • Re: Sequenza di Fibonacci

    Ciao Lysz210, come vedi il gioco consiste nello scrivere l' algoritmo usando il minor numero di caratteri, non ha una utilità particolare, ma come ti dicevo è un gioco e ci stiamo divertendo un sacco.

    ixamit ha scritto:


    
    void f(int n)
    {
        /* pair */
        unsigned long long a=1, b=1;
        for(; n--; printf("%llu\n%llu\n", a,b), a+=b, b+=a);
    }
    
    Ciao ixamit, questa è forte! La trovo una soluzione molto elegante, molto bello il a+=b, b+=a.

    A questo punto ho poco da aggiungere, giusto una limatina, tre caratteri in meno alla versione ricorsiva:
    
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    void f(int n, long long a=1, long long b=1)
    {
        n--?cout<<a<<endl,f(n,b,a+b):0;
    }
    
    int main()
    {
        f(10);
        return 0;
    }
    
    Inoltre mettendo i valori di default la chiamata f(10) risulta più chiara.
  • Re: Sequenza di Fibonacci

    Non eravate al lavoro vuoi due?
    Vale come meno caratteri? L'exe ne avrà meno tutto risolto in compile time
    
    template<int N> struct fib {
    	static const int result = fib<N-1>::result + fib<N-2>::result;
    };
    
    template<> struct fib<0> {
    	static const int result = 0;
    };
    
    template<> struct fib<1> {
    	static const int result = 1;
    };
    
    #include <iostream>
    int main()
    {
    	std::cout << "Fib(10) = " << fib<10>::result << std::endl;
    }
    
  • Re: Sequenza di Fibonacci

    skynet ha scritto:


    Non eravate al lavoro vuoi due?
    Parto domani, prima Svizzera e poi Germania. Tra un preparativo e l' altro non ho saputo resistere a scrivere qualcosa. Sai quando ci si diverte!
  • Re: Sequenza di Fibonacci

    skynet ha scritto:


    Non eravate al lavoro vuoi due?
    sabato, non oggi che è domenica. Comunque è andato tutto bene, clienti + che soddisfatti

    skynet ha scritto:


    Vale come meno caratteri? L'exe ne avrà meno tutto risolto in compile time
    ciao skynet, questo è il gioco preferito di barba59 ed io, nonostante non possa competere, sento un'irrefrenabile voglia di contribuire fin dove posso.
  • Re: Sequenza di Fibonacci

    Non avevo capito bene il gioco, scusate. Non conosco il c e i vostri codici sembra molto delle formule magiche e non vedo l'ora che finisca tutto per vedere svelato i misteri.
    Ciao buon proseguimento.
Devi accedere o registrarti per scrivere nel forum
12 risposte