Fibonacci OOP



  • @pinguin: Hat aber im Prinzip wenig mit OOP zu tun? Viel eher mit Metaprogrammierung?! Nur weils hier doch um OOP ging 🙂

    MfG SideWinder



  • desert pinguin schrieb:

    Das ist die richtige Lösung 😉

    #include <iostream> 
    using namespace std; 
    template<unsigned i> 
    struct fibonacci { 
      static const unsigned result = fibonacci<i-1>::result + fibonacci<i-2>::result; 
    }; 
    
    template<> 
    struct fibonacci<0> { 
      static const unsigned result = 1; 
    }; 
    
    template<> 
    struct fibonacci<1> { 
      static const unsigned result = 1; 
    };
    int main() { 
      cout << fibonacci<9>::result; 
    }
    

    Copyright von Rainer Baumann

    2 fragen:
    1. wird das hier während des compilieren berechnet?
    2. ist das wirklich der richtige algorithmus? fiboacci war doch
    1,1,2,3,5,8,13...

    //edit aua... hab mich verguckt, die funktion berechnet die Zahl an der 9. stelle der liste oder?^^



  • zu 1. ja
    zu 2.(edit): ja



  • @otze: Falls dich das interessiert google mal nach "Metaprogrammierung" bzw. "Generische Programmierung".

    MfG SideWinder



  • SideWinder schrieb:

    @otze: Falls dich das interessiert google mal nach "Metaprogrammierung" bzw. "Generische Programmierung".

    MfG SideWinder

    da kannste dich drauf verlassen, dass ich danach googlen werde, ich intressiere mich für alle fein(grob)heiten der programmierung 🙂



  • otze schrieb:

    SideWinder schrieb:

    @otze: Falls dich das interessiert google mal nach "Metaprogrammierung" bzw. "Generische Programmierung".

    da kannste dich drauf verlassen, dass ich danach googlen werde, ich intressiere mich für alle fein(grob)heiten der programmierung 🙂

    perfekter einsteig in die metaprogrammierung ist imho Blitz++ und Todd Verhouldsons artikel über expression templates (als link bei Blitz++ angegeben). die expression templates ruhig mal ein wenig nachprogrammieren. danach am besten ein bis zwei jahre lisp oder prolog programmieren. die kluft zwischen den einfachen sachen und den krassen ist schlimm gross. und dann den code von boost lesen.



  • Wenn man die Fibonaccizahlen schon in eine Klasse kapselt wäre das doch ein schönes Beispiel für Memoization, um die Laufzeit im Zaun zu halten.



  • MaSTaH schrieb:

    Wenn man die Fibonaccizahlen schon in eine Klasse kapselt wäre das doch ein schönes Beispiel für Memoization, um die Laufzeit im Zaun zu halten.

    warum nicht iterov oder tail-recursive machen?
    memoization ist für micht nur ne zweitbeste lösung.



  • Jester schrieb:

    SirLant schrieb:

    ... sollte ja auch nur zeigen,
    wie ich so was schreiben würde.

    Eben, und ich hoffe doch eigentlich, daß Du es iterativ schreiben würdest.

    Hälst du mich wirklich für so dumm 😕 😮 🤡 😃 😉

    Klar würd ichs iterativ machen, aber warscheinlicher wäre, dass es es mit der
    Templatemetaprogrammierung lösen würd, weil ich das schon fertig aufm PC hab,
    das andere müsst ich erst schreiben 🙂



  • Nein, ich halte Dich nicht für dumm, deswegen habe ich ja gesagt, ich hoffe, daß Du es iterativ schreiben würdest und nicht, wie Du weiter oben behauptet hast rekursiv.

    Und die template-Lösung scheidet aus:

    int i;
    cin >> i;
    cout << fibonacci(i);
    


  • int i;
    std::cin >> i;
    std::cout << fibonacci<i>::result;
    


  • Jester schrieb:

    Nein, ich halte Dich nicht für dumm, deswegen habe ich ja gesagt, ich hoffe, daß Du es iterativ schreiben würdest und nicht, wie Du weiter oben behauptet hast rekursiv.

    Und die template-Lösung scheidet aus:

    int i;
    cin >> i;
    cout << fibonacci(i);
    

    War doch nur der einfachheit wegen Rekursiv, ist doch viel kürzer zu schreiben 🤡

    Also wenn ich das mit der Metaprogrammierung richtig verstanden habe, wird das
    in diesem Fall ganz normal zur Laufzeit ausgewertet, oder hab ich da was falsch verstanden?



  • SirLant schrieb:

    Also wenn ich das mit der Metaprogrammierung richtig verstanden habe, wird das
    in diesem Fall ganz normal zur Laufzeit ausgewertet, oder hab ich da was falsch verstanden?

    Ne, wie sollte das gehen?
    schließlich ist i keine Compiletime Konstante, aber genau das wird von Templates verlangt.



  • Shade Of Mine schrieb:

    SirLant schrieb:

    Also wenn ich das mit der Metaprogrammierung richtig verstanden habe, wird das
    in diesem Fall ganz normal zur Laufzeit ausgewertet, oder hab ich da was falsch verstanden?

    Ne, wie sollte das gehen?
    schließlich ist i keine Compiletime Konstante, aber genau das wird von Templates verlangt.

    Dachte gerade, dass dann so lange neue Objekte erzeugt werden, bis der Spezialfall
    eintritt, dieses Objekt wird zuEnde erstellt, wodurch die ganze Kette der Objekte
    sich auflöst und wie bei ner Rekursion, dann eines nach dem anderen fertig wird
    und das letzte, dann das Ergebnis enthält, aber hast ja recht, es kann ja gar
    nicht gehen 🤡


Anmelden zum Antworten