[ bags @ 17.03.2005. 10:09 ] @
Treba mi pomoc :

Moram uraditi algoritam za fibbonaci niz ali sa vremenom O(n) plus mora biti rekurzivan.
Apsolutno mi ne pada na pamet kako

Fibbonaci niz : f(n) = ( 1 ako je n =< 2
f(n-1)+f(n-2) ako je n > 2 )


Pozdrav
[ jablan @ 17.03.2005. 10:31 ] @
Nisam neki stručnjak za složenost, ali da pokušam:
Code:

using System;

namespace ConsoleApplication2
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: Add code to start application here
            //

            int a;
            int b;
            fib (7, out a, out b);
        }

        static void fib(int i, out int sa, out int sb) 
        {
            int sc;
            int sd;

            if (i <= 2) 
            {
                sa = 1; sb = 1;
            }
            else 
            {
                fib(i - 2, out sc, out sd);
                sa = sc + sd;
                sb = sd + sa;
            }
            Console.Write(sa.ToString() + " " + sb.ToString() + " ");
        }
    }
}
[ Mihajlo Cvetanović @ 17.03.2005. 11:04 ] @
Jel' ovo Java ili C#?

Sećam se da sam u C++ video rešenje koje koristi std::pair kao povratnu vrednost rekurzivne funkcije. To bi stvarno animiralo profesora...

[Ovu poruku je menjao Mihajlo Cvetanović dana 17.03.2005. u 14:20 GMT+1]
[ jablan @ 17.03.2005. 12:07 ] @
Citat:
Mihajlo Cvetanović: Jel' ovo Java ili C#?

C#. Da, pair bi super bio (vidiš, to mi nije palo na pamet), u .NET-u postoji, ali je smešten u Web namespaceu. U principu, uvek može da se napravi.
[ zi:: @ 17.03.2005. 12:21 ] @
Rekurzivni fibonacci se racuna stvarno ako samo moras, za potrebe pokazivanja i rekurzije.

Fibonacci se moze izracunati i sa O(log n) ...
[ Mihajlo Cvetanović @ 17.03.2005. 13:45 ] @
Log n? Kako? Znam za računanje Fibonačijevog broja preko stepena zlatnog preseka (što bi bilo O(1)), ali za O(log n) nisam čuo.
[ jablan @ 17.03.2005. 13:48 ] @
Ček ček jel vi pričate o nalaženju niza ili samo jedne vrednosti f(n)?
[ zi:: @ 17.03.2005. 13:55 ] @
Jedne vrednosti ...

Pogledacu kuci algoritam za O(log n), nije bas trivijalan.

Stepen (pa i zlatnog preseka) nije O(1), jer za racunanje stepena treba vise nego konstantno vreme.
[ bags @ 17.03.2005. 14:37 ] @
Hvala na odgovoru .

Posto mi ne radimo c# nego neki pseudo jezik imam jos jednom pitanje.

Kada incijalizujes sc i sd njihova pocetna vrednost je nula ili ... ?

[ Damjan S. Vujnovic @ 17.03.2005. 14:54 ] @
U vezi sa O(log n) algoritmom...

http://en.wikipedia.org/wiki/F...number_program#Matrix_equation

pogledati po "Matrix equation".

Ideja je da se n-ti stepen matrice nadje sukcesivnim kvadriranjima i ocigledno je primenljiva i na onu formulu sa sqrt(5) (zlatni presek, kao sto neko vec rece), ali kada se koristi matrica nema problema sa ne-celim brojevima i tacnosti.

D.

[Ovu poruku je menjao Damjan S. Vujnovic dana 17.03.2005. u 15:57 GMT+1]
[ jablan @ 17.03.2005. 14:55 ] @
Ako malo bolje proučiš kood, videćeš da je nebitna inicijalna vrednost te dve promenljive, pošto se one pune rekurzivnim pozivom funkcije, tj. inicijalizuje ih funkcija, vrativši rezultat u njima.

Pseudokodno, onaj rekurzivni poziv je ustvari (sc, sd) = fib(i - 2). Ok?
[ bags @ 17.03.2005. 15:12 ] @
Sad je sve jasno. Imas pivo kad navratim do BG-a . ;)
[ sklitzz @ 04.04.2005. 17:02 ] @
Pa mogla bi se ta složenost uhvatiti sa metodom memoizacije, evo primjera:

Code:

#include <iostream>
using namespace std;

int niz[100] = { 0 };

int fib( int n )
{
    if( n == 0 ) return 0;
    else if( n == 1 ) return 1;
    else if( niz[n] > 0 ) return niz[n];
    else
    {
        //Memoizacija
        niz[n] = fib( n - 1 ) + fib( n - 2 );
        return niz[n];
    }
}

int main()
{
    int n; cin >> n;
    
    niz[0] = 0;
    niz[1] = 1;
    
    cout << fib( n ) << endl;
    return 0;
}

[ zi:: @ 04.04.2005. 17:27 ] @
Interesantno, ovako ti treba i mesta O(n), sto nije zanemarivo. Doduse, dobijes sve Fibonaccijeve brojeve do n-tog ...
[ sklitzz @ 04.04.2005. 19:03 ] @
Da ali je puno brze i isplativije i jednom kad ih izracunas imas O(1) za dobiti bilo koji
fibonacciev broj.
[ Milos Stojanovic @ 04.04.2005. 22:00 ] @
Citat:
bags:
Moram uraditi algoritam za fibbonaci niz ali sa vremenom O(n) plus mora biti rekurzivan.

:) Dakle ceo niz + rekurzivan + O(n), tako da je samo ovo poslenje rešenje ispravno, kako se meni čini

BTW, da nije uslov rekurzija i da ne treba ceo niz, moglo bi na još par načina da se odradi, evo nešto napamet, moguće je i da ne radi tačno, ali bar je ideja tu
Code:
// O(n)
int fibonaci1(int n)
{
    int f2 = 1;    // f(0) = 1
    int f1 = 1;     // f(1) = 1
    int i;
    for(i=2; i<=n; i++)
    {
        f = f2 + f1;
        f2 = f1;
        f1 = f;
    }
    return f;
}
// O(1) - uslovno, ako zanemarimo slozenost funkcije pow
int fibonaci2(int n)
{
    float sqrt5 = pow(5, 0.5) / 0.5;    
    return (int) ((pow(0.5 + sqrt5, n) - pow(0.5 - sqrt5, n)) / (sqrt5 * 2.0));
}
[ sklitzz @ 05.04.2005. 13:57 ] @
Gdje je tu tebi rekurzija?
[ Milos Stojanovic @ 06.04.2005. 01:16 ] @
Pa u tvom rešenju je ima, ko što rekoh:
Citat:
trooper: Dakle ceo niz + rekurzivan + O(n), tako da je samo ovo poslenje rešenje ispravno, kako se meni čini

a ova moja rešenja sam poslao čisto informativno, ko što sam naglasio:
Citat:
trooper: da nije uslov rekurzija i da ne treba ceo niz


damn, mrzim da sam sebe citiram.