Newsgroup: it.comp.lang.pascal
Titolo: Serie di Fibonacci

Devo fare il seguente programma in Pascal:
"Scrivere un programma che legga da input un numero intero n e dia quindi in
output tutti i numeri positivi non maggiori di n e che non appartengono alla
succesione di Fibonacci."
Sono ormai 2 giorni che provo a risolverlo, ma non ci riesco proprio. Se
qualcuno mi sa aiutare mille grazie.
Ciao
Carlito's

Carlito's ha scritto:

Scusa la mia ignoranza! Cos'è Fibonacci?
MaTTeO.

 MaTTeO.
La successione di Fibonacci è la sequenza di numeri interi definita dalle
seguenti regole:
1. il primo numero della succesione è 1;
2. il secondo numero della succesione è 1;
3. ogni successivo numero della succesione è la somma dei due che lo
precedono.
1,1,2,3,5,8,13,21,34,55,89,.....


Web Site: 
http://asterix75.homeip.net
"Unix IS user friendly. It's just selective about who its friends are"




 Io ci provo:
Allora ci provo anch'io!
Program SerieMenoFibonacci;
 Uses CRT;
Var n, i: Integer;
Function AppAFibo(Num: Integer): Boolean; (*AppAFibo=Non Appartiene A Fibonacci*)
Var Fib, Fib1, Tmp: Integer;
 Begin
  Fib := 1;
  Fib1 := 0;
  Repeat
   Tmp := Fib;
   Fib := Fib + Fib1;
   Fib1 := Tmp;
   If Num = Fib Then AppAFibo := True
    Else AppAFibo := False;
  Until Fib >= Num;
End;
Begin
 ClrScr;
 Write('Inserisci un numero intero: ');
 ReadLn(n);
 WriteLn('Serie di numeri positivi, minori uguali di ', n,',');
 WriteLn('non appartenenti alla serie di Fibonacci:');
 If n < 4 Then Write('Non ci sono numeri che soddisfino il criterio!')
  Else
  For i := 4 To n Do
   If AppAFibo(i) = False Then Write(' ',i);
 ReadLn
End.
Però sinceramente mi piace più quello di Alessandro, sarà perché va a capo!?! ;-)
Ciao MaTTeO.

 2. Poi stampi tutti i numeri che non sono nel vettore.
Il pascal per me è abbastanza arabo. Sono solo 10 giorni che provo a
programmare.
Non ho idea di cosa possa essere un vettore.
Però ho fatto un programmino che mi stampa tutti i numeri di Fibonacci
minori di n. Adesso volevo dire al programma di stampare tutti gli interi
diversi da Fibonacci, ma non so come fare.
Program Numeri_di_Fibonacci;
Uses Crt;
label 10;
var fib1, fib2, fibn : integer;
    i, n : integer;
    c : char;
Begin
10 : clrscr;
writeln('Programma che stampa a video i primi n numeri di Fibonacci');
writeln;
writeln('Inserisci un numero intero positivo:');
readln(n);
if n<=0 then goto 10;
fib1:=1;
fib2:=1;
writeln('I numeri di Fibonacci <= a ',n, ' sono: ');
writeln('1');
for i:=3 to n do
   begin
     fibn:=fib1+fib2;
     fib1:=fib2;
     fib2:=fibn;
     if fibn<=n then writeln(fibn);
   end;
c:= 'n';
while c='n' do
   begin
     writeln;
     writeln('Voui terminare il programma? [s/n]');
     read(c);
     if c='s' then write('Programma terminato -premi un tasto per uscire-');
     if c='n' then goto 10;
   end;
repeat until keypressed;
end.
Ciao e Grazie
Carlito's


Web Site: 
http://asterix75.homeip.net
"Reboots are for kernel upgrades only"

 Carlito's
Fammi sapere se vuoi quel piccolo manualetto!
Ciao
MaTTeO.


Web Site: 
http://asterix75.homeip.net


Alessandro Astarita ha scritto:

Infatti ho anche detto che il tuo mi piace di più!
Ciao MaTTeO.

 wrote in message
8d98fa$7eet1$1...@fu-berlin.de...

Questa è la funzione
function fibonacci (n : integer) : integer;
begin
    if (n=1) then fibonacci:=0
    else if n=2 then fibonacci:=1
    else fibonacci:=fibonacci(n-1)+fibonacci(n-2); (* doppia chiamata
ricorsiva *)
end;
Ciao Re di Cuori
mirc #portici
icq 74961604
end;

 end;
E' abbastanza pesante un algoritmo del genere, tipo su macchine lente o per
numeri molto grandi: abbiamo fatto una prova in assembler mips che per
calcolare fibonacci di 45 ci voleva roba come 15 minuti!!!!!!!!! Proporrei di
fare una procedura del genere:
Function Fibo(n:longint):longint;
var
  i, f2, f1, f0: longint;
begin
  f2:=0;  // fibonacci dei due numeri precedenti quello corrente
  f1:=1;  // fibonacci del numero precedente quello corrente
  if n=0 then
    Fibo:=f2
  else
  if n=1 then
    Fibo:=f1
  else
  begin
    for i:=2 to n do
    begin
      f0:=f1+f2;  // assegno al numero corrente la somma dei due precedenti
      f2:=f1;  // sposto le somme
      f1:=f0;
    end;
    Fibo:=f0;
  end;
end;
Non l'ho provata, ma dovrebbe funzionare.....

 wrote in message 8he1ov$e7s$2...@nslave2.tin.it...

Il problema è che quando si richiede l'algoritmo di fibonacci e quindi la
sua implementazione viene richiesta con un algoritmo ricorsivo.
Ciao

 sua implementazione viene richiesta con un algoritmo ricorsivo.
Ma se parliamo di programmazione allora dobbiamo parlare anche di
efficenza!!!!
In quel progetto in assembler ho preso 30 e lode proprio perchè lo ho fatto
(assieme ai miei compagni) proprio iterativo, e non ricorsivo!!!!!
Ciao

 wrote in message 8hop72$fsa$1...@nslave1.tin.it...

Mi fa piacere che avete preso 30 e lode, ma in informatica la serie di
fibonacci viene introdotta come algoritmo ricorsivo, e viene sviluppato da
tutti gli informatici in ricorsione inquanto molto più leggibile di quello
iterarivo. Inoltre se vogliamo parlare di efficienza, dobbiamo aggiungere
robustezza, complessità computazionale e leggibilità.
Cmq gli algortimi sono frutto del sapere ma soprattutto dell'immaginazione
del programmatore al quale tocca anche l'arduo compito di spiegarli....

 del programmatore al quale tocca anche l'arduo compito di spiegarli....
Sempre come dicono Patterson - Hennessey: "Legge di progetto 3: Un boun
progetto ha bisogno di buoni compromessi)!! E anche qui non c'è verso di
ribattere (ricordati che è la bibbia......): se ottieni un codice
esteremamente leggibile ma "terribilmente inefficiente" mi sembra proprio il
caso di cambiarlo, rendendolo magari un po' più complesso da capire
all'inizio, ma che poi si farà apprezzare per la sua semplicità e velocità!!
Ed è questo il compito del programmatore: trovare un algoritmo che sia a metà
strada tra leggibilità, complessità, efficenza!!
Ciao