[ UnderLander @ 11.01.2006. 17:39 ] @
ovako: zadat mi je zadatak u c-u koji glasi:
napisati funkciju koja sabira prvih n fibonacijevih brojeva. funkcija mora da bude rekurzivna.
sme da se koristi: if, while, do while, for, pokazivaci.


e sad, da nije FUNKCIJU, bilo bi prosto, ali sve mora da bude u jednoj funkciji, koja ce samo da se pozove iz main...

pokusavao sam nesto, i nije bas uspelo....


jes' da i nije neki zadatak, ali bas me zanima kako...
[ NrmMyth @ 11.01.2006. 19:14 ] @
Code:
int niz = {0,1} // nadalje inicilaliziran sa -1
for( int i = 0; i < FIB_BR; ++i )
{
    if( i >= 2 )
             niz[i] = niz[i-1] + niz[i-2];
}
// nakon for-a iscitas iz niza svoj broj

Ovo ti je jedno jednostavnije rijesenje. Naravno da se da priloagoditi potrebama.
[ #Ninja# @ 11.01.2006. 19:23 ] @
Code:
unsigned int fibonacci( unsigned int n ) 
 { 
    if ( n == 0 || n == 1 )
        return 1; 
    else
        return (fibonacci( n - 1 ) + fibonacci( n - 2 )); 
 } 
[ UnderLander @ 13.01.2006. 16:48 ] @
@NnrmMyth:
ehm, nije dozvoljeno koristiti nizove. takvo nesto sam i ja napisao, ali ne ispunjava uslov zadatka...

@#Ninja#
ne znam da li je to ispalo kako treba, ali meni taj kod vraca fibonacijev broj, pomeren za jedan, a nikako ne njihov zbir
[ NrmMyth @ 13.01.2006. 18:07 ] @
Code:
unsigned int fibonacci( unsigned int n ) 
 { 
    if ( n == 0 )
        return 0;
    else if ( n == 1 )
        return 1;
    else
           return (fibonacci( n - 1 ) + fibonacci( n - 2 )); 
 } 
[ Mali Misha @ 13.01.2006. 18:49 ] @
Da li ovo pomaze?

Code:
unsigned int fib(unsigned int a,unsigned int b,unsigned int n,unsigned int res)
{
    if(--n==0) return res;
    return fib(b,a+b,n,res+b);
}

Poziv sa

fib(0,1,broj_brojeva,0);
[ UnderLander @ 14.01.2006. 17:14 ] @
ne bas :(

meni se cini da se mi nismo razumeli...
znaci, ako unesem broj 6, funkcija vraca:
1+1+2+3+5+8
[ Mali Misha @ 14.01.2006. 17:54 ] @
Koliko ja znam, fibonacci-ev red ide od 0.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...
[ UnderLander @ 14.01.2006. 21:46 ] @
pocinje od nule? izvinjavam se, onda je moja greska...

nas je izvesni profesor ubedjivao po tom pitanju da ako je prvi nula, zbir prethodna dva je isto nula, pa ne moze ni da se pocne, dok je sa jedan pravi pocetak...

..izgleda da je to samo jedna od mnogih stvari u kojima nije u pravu


i da, izvinjavam se zbog eventualne zabune, funkcija ne treba da vrati bukvalno string "0+1+1+2+3+5", vec rezultat toga, u ovom slucaju 12
[ Mali Misha @ 15.01.2006. 00:09 ] @
I ja sam bio zaboravio, pa sam konsultovao ovo. Ko zna, mogao sam i pogresno da ga protumacim. U svakom slucaju, ako zamenis "--n" sa "n--" u funkciji gore, dobices trazeni rezultat.

Ako se pazi na trosenje memorije, staticke promenjive mogu da urade lep posao:

Code:
unsigned int fib1(unsigned int n)
{
    static unsigned int a,b,res,start=0,temp;

    if(start == 0)
    {        
        start = b = 1;
        res = a = 0;
    }
    
    if(n<2) // if(n<1)
    { return start=0, res; }

    res += (temp = b);
    b += a;
    a = temp;

    return fib1(--n);
}

Nadam se da je pravilno implementirano.
[ UnderLander @ 15.01.2006. 20:55 ] @
staticke promenljive? znaci ima da ga olesim (profesora)...

aj sad, molim te, polako
prvo, ono unsigned int. sta je to? da li mora svuda (probao sam samo int i cini mi se da je sve isto)
zatim staticki. sta bi to (samo ukratko, ne moras da se cimas) bilo?
[ del-boy @ 15.01.2006. 23:07 ] @
unsigned int je neoznačeni ceo broj. To u suštini znači da može biti samo pozitivan, odnosno da nema bit za znak na početku!

Statičke promenljive čuvaju podatke koji su trajni, odnosno čuvače vrednost do kraja izvršavanja programa!
[ Djordjevic @ 18.01.2006. 14:01 ] @
Samo da vam skrenem paznju.
Prva 2 clana Fibonacijevog niza su 1.

Dakle niz ide ovako:

1,1,2,3,5,8,13,21,34,55,...

Dakle ne krece od 0. To je sigurno
[ Mali Misha @ 18.01.2006. 17:04 ] @
Mislim da moram da te ispravim. Fibonacijev red pocinje sa 1,1,2, itd. ako se kao argumenti uzimaju samo prirodni brojevi ali je sam definisan i za f(0) = 0. Uzgred:
Citat:
wikipedia.de: Oft wird auch f(0) = 0 ausgelassen und die Fibonacci-Folge mit f(1) = 1 und f(2) = 1 beginnend definiert, insbesondere bei der Anwendung auf Situationen, in denen ein Anfangswert Null keinen Sinn ergibt.
„Cesto biva izostavljeno f(0) = 0 i Fibonacijev red biva pocetno definisan sa f(1) = 1 i f(2) = 1, narocito prilikom primene u situacijama kada pocetna vrednost nula nema smisla.“ ( izvor )