Vai alla freccia - Homepage - BlogRoom - Mappa
Visualizza Messaggi.


Nick: NEVERLAND
Oggetto: re:Serie di Fibonacci
Data: 22/5/2006 18.23.59
Visite: 36

divertiti e poi mi fai sapere :°D

Definizione
I numeri di Fibonacci sono definiti dalla relazione di ricorrenza:
F(1)=1
F(2)=1
F(n)=F(n-1)+F(n-2), per n>=3
Talvolta tale relazione viene data a partire da 0:
F(0)=0
F(1)=1
F(n)=F(n-1)+F(n-2), per n>=2
Nel seguito consideremo questa seconda formulazione.
Algoritmo ricorsivo
E' relativamente semplice scrivere una funzione Pascal ricorsiva che calcoli l'n-esimo numero di Fibonacci (si tratta sostanzialmente di tradurre da "notazione matematica" a Pascal).

{AI: n>=0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibR (n:integer):longint;
begin
if n=0 then fib:=0
else if n=1 then fibR:=1
else fibR:=fibR(n-1)+fibR(n-2)
end;

La funzione ricorsiva ha un inconveniente: ogni chiamata della funzione con argomento n>1 causa due successive chiamate ricorsive, ovvero: il numero totale di chiamate (complessita' computazionale in tempo) cresce esponenzialmente rispetto al valore del parametro n.

Il numero massimo di record di attivazione presenti contemporaneamente sullo stack (complessita' computazionale in spazio) e' lineare in n. Per rendersi conto di cio', e' sufficiente disegnare l'albero delle chiamate della funzione fibR(n), ad es. per n=5.

Algoritmo iterativo
Per scrivere l'algoritmo iterativo procediamo nel seguente modo.
Consideriamo l'intestazione della procedura, con asserzioni iniziali e finali:
{AI: n>0}
{AF: restituisce F(n)}

Per n<2 il valore di F(n) e' dato (F(0)=0 e F(1)=1).
Per n>=2, invece il valore di F(n) e' calcolato a partire da F(n-1) e F(n-2).
Un invariante di ciclo per il calcolo di F(n) dovra' quindi necessariamente menzionare:
un indice i che varia da 1 a n
una variabile f che contiene F(i) e una variabile p che contiene F(i-1)
L'invariante sara' quindi il seguente:
{1<=i<=n, f=F(i), p=F(i-1)}

Possiamo quindi procedere con la scrittura del codice Pascal.

Per prima cosa scriviamo dello "pseudo-codice", ovvero codice Pascal in cui alcuni dettagli non sono sviluppati:


{AI: n>0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibI (n:integer):longint;
var
i:integer;
f,p:longint;
begin
f:=1; p:=0;

i:=1;
while i<=n-1 do {1<=i<=n, f=F(i), p=F(i-1)}
begin
-- assegna F(i+1) a f, e F(i) a p
i:=i+1;
end;
end;

fibI:=f;
end;

Possiamo ora raffinare lo pseudo-codice (nel fare cio' abbiamo introdotto una variable ausiliaria):


{AI: n>0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibI (n:integer):longint;
var
i:integer;
f,p:longint;
aux:longint; {variabile ausiliaria}
begin
f:=1; p:=0;

i:=1;
while i<=n-1 do {1<=i<=n, f=F(i), p=F(i-1)}
begin
aux:=f;
f:=f+p; p:=aux;
i:=i+1;
end;
end;

fibI:=f;
end;

Ora miglioriamo la procedura precedente, in modo che funzioni anche per n=0.


{AI: n>=0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibI (n:integer):longint;
var
i:integer;
f,p:longint;
aux:longint; {variabile ausiliaria}
begin
if n=0 then fibI:=0 else
begin
f:=1; p:=0;

i:=1;
while i<=n-1 do {1<=i<=n, f=F(i), p=F(i-1)}
begin
aux:=f;
f:=f+p;
p:=aux;
i:=i+1;
end;

fibI:=f;
end;
end;

Il codice risultante e' "appesantito" (di meno facile lettura). Usando l'istruzione exit del Turbo Pascal e' possibile produrre una versione piu' "leggera" (di piu' facile lettura).


{AI: n>=0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibI (n:integer):longint;
var
i:integer;
f,p:longint;
aux:longint; {variabile ausiliaria}
begin
if n=0 then begin fibI:=0; exit end;

{n>0}
f:=1; p:=0;

i:=1;
while i<=n-1 do {1<=i<=n, f=F(i), p=F(i-1)}
begin
aux:=f;
f:=f+p;
p:=aux;
i:=i+1;
end;

fibI:=f;
end;

Sempre per migliorare la leggibilita' del codice e' consigliabile rimpiazzare il "while" con un "for":


{AI: n>=0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibI (n:integer):longint;
var
i:integer;
f,p:longint;
aux:longint; {variabile ausiliaria}
begin
if n=0 then begin fibI:=0; exit end;

{n>0}
f:=1; p:=0;

for i:=1 to n-1 do {1<=i<=n, f=F(i), p=F(i-1)}
begin
aux:=f;
f:=f+p;
p:=aux;
end;

fibI:=f;
end;

Osserviamo infine che (siccome F(n-1)=F(n)-F(n-2)) possiamo eliminare la variabile ausiliaria aux, migliorando ulteriormente la leggibilita del codice.


{AI: n>=0}
{AF: restituisce l'n-esimo numero di Fibonacci}
function fibI (n:integer):longint;
var
i:integer;
f,p:longint;
begin
if n=0 then begin fibI:=0; exit end;

{n>0}
f:=1; p:=0;

for i:=1 to n-1 do {1<=i<=n, f=F(i), p=F(i-1)}
begin
f:=f+p;
p:=f-p;
end;

fibI:=f;
end;

La complessita' computazionale in tempo della versione iterativa e' lineare in n.

Il numero massimo di record di attivazione presenti contemporaneamente sullo stack (complessita' computazionale in spazio) e' costante.

Riempimento di un vettore con i primi n+1 numeri di Fibonacci
Una prima versione
const
MAX=100; {MAX>=1}

type
vett = array[0..MAX] of longint;

{AI: 0<=n<=MAX}
{AF: f[0..n] contiene i numeri di Fibonacci F(0),...,F(n)}
procedure fibP (f:vett; n:integer);
var
i:integer;
begin
f[1]:=0; f[2]:=1;

for i:=1 to n-1 do {1<=i<=n, f[0..i] contiene F(0),...,F(i)}
f[i+1]:=f[i]+f[i-1];
end;

Una seconda versione (ossevate l'invariante)
const
MAX=100; {MAX>=1}

type
vett = array[0..MAX] of longint;

{AI: 0<=n<=MAX}
{AF: f[0..n] contiene i numeri di Fibonacci F(0),...,F(n)}
procedure fibP (f:vett; n:integer);
var
i:integer;
begin
f[1]:=0; f[2]:=1;

for i:=2 to n do {2<=i<=n+1, f[0..i-1] contiene F(0),...,F(i-1)}
f[i]:=f[i-1]+f[i-2];
end;

Ultime Visioni:
Il Codice Da Vinci (***)
Crash - Contatto Fisico (***)
Il Conto E' Chiuso (*)
L'Era Glaciale (***)
Il Castello Errante di Howl (***)
H2Odio (**)
L'Era Glaciale 2 - Il Disgelo (***)



Rispondi al Messaggio | Indietro | Indice topic | Quota Testo | Vai su| Segnala ad un amico|Successivo


Serie di Fibonacci   22/5/2006 17.41.57 (198 visite)   fruitloop
   re:Serie di Fibonacci   22/5/2006 17.45.2 (52 visite)   FoggyPunk
      e jaaaa   22/5/2006 17.46.33 (41 visite)   fruitloop
         re:e jaaaa   22/5/2006 17.47.22 (32 visite)   FoggyPunk
            re:e jaaaa   22/5/2006 17.51.15 (30 visite)   fruitloop
               re:e jaaaa   22/5/2006 17.53.30 (22 visite)   KillerKlown
                  ehm   22/5/2006 17.55.24 (32 visite)   fruitloop
               re:e jaaaa   22/5/2006 18.38.0 (28 visite)   FoggyPunk
   re:Serie di Fibonacci   22/5/2006 17.46.6 (47 visite)   The Stand
   Facile   22/5/2006 17.48.49 (46 visite)   KillerKlown
      re:Facile   22/5/2006 17.49.43 (31 visite)   FoggyPunk
         re:Facile   22/5/2006 17.50.58 (25 visite)   KillerKlown
   re:Serie di Fibonacci   22/5/2006 18.23.59 (35 visite)   NEVERLAND
      re:Serie di Fibonacci   22/5/2006 18.46.38 (20 visite)   KillerKlown
      re:Serie di Fibonacci   22/5/2006 18.55.33 (25 visite)   fruitloop
      re:Serie di Fibonacci   22/5/2006 19.3.22 (32 visite)   AntScardi
   re:Serie di Fibonacci   22/5/2006 18.46.14 (45 visite)   DeK
   re:Serie di Fibonacci   22/5/2006 19.18.25 (32 visite)   AntScardi
      Antscard   22/5/2006 19.50.27 (25 visite)   fruitloop
         re:Antscard   22/5/2006 20.5.26 (32 visite)   AntScardi
            la formula   22/5/2006 20.19.2 (40 visite)   fruitloop
               re:la formula   22/5/2006 20.24.13 (27 visite)   AntScardi
   re:Serie di Fibonacci   22/5/2006 19.52.30 (22 visite)   Ery
      Ery   22/5/2006 19.54.18 (35 visite)   fruitloop
         re:Ery   22/5/2006 19.59.7 (23 visite)   Ery
            re:Ery   22/5/2006 20.1.54 (25 visite)   fruitloop
               re:Ery   22/5/2006 20.2.48 (19 visite)   Ery
   re:...............   22/5/2006 20.3.31 (28 visite)   Mojito_
   ok l'ho trovata....   22/5/2006 20.16.53 (28 visite)   Ery
      yes tnx   22/5/2006 20.22.1 (30 visite)   fruitloop
         re:yes tnx   22/5/2006 20.24.0 (23 visite)   Ery
            re:yes tnx   22/5/2006 20.26.14 (19 visite)   fruitloop
               re:yes tnx   22/5/2006 20.28.21 (27 visite)   Ery
                  re:yes tnx   22/5/2006 20.29.54 (25 visite)   fruitloop
                     re:yes tnx   22/5/2006 20.33.30 (37 visite)   Ery
                        re:yes tnx   22/5/2006 20.35.3 (13 visite)   fruitloop
                           re:yes tnx   22/5/2006 20.36.6 (23 visite)   Ery
                              re:yes tnx   22/5/2006 20.40.45 (45 visite)   AntScardi
                                 re:yes tnx   22/5/2006 20.45.12 (29 visite)   fruitloop
                                    re:yes tnx   22/5/2006 20.47.54 (22 visite)   AntScardi (ultimo)

Nick:
Password:
Oggetto:
Messaggio:

vai in modalità avanzata
                 


Rimani nel thread dopo l'invio


Ricerca libera nel sito by Google (Sperimentale, non sono ancora presenti tutti i contenuti)

Google
 



Clicca per leggere le regole del forum



Imposta IRCNapoli come homepage

Clicca per andare sul forum di prova.
IRCNapoli "Un racconto a più mani".
Mappa del forum

Visualizza tutti i post del giorno 22/05/2006
Visualizza tutti i post del giorno 21/07/2025
Visualizza tutti i post del giorno 20/07/2025
Visualizza tutti i post del giorno 19/07/2025
Visualizza tutti i post del giorno 18/07/2025
vai in modalità avanzata