Fibonacci Zahlen per C++ darstellen



  • FreakY<3Cpp schrieb:

    👍 ... Musst aber double zurückgeben.

    Nö.



  • FreakY<3Cpp schrieb:

    Xebov schrieb:

    if(number==1 || number==2)
    {
        return 1;
    };
    
    [e]rarr[/e]
    
    if(number <= 2)
    {
        return 1;
    }
    

    das haut aber nicht ganz hin, weil 1=1 2=1, 0=0 und unter 0 gibts nicht.



  • volkard schrieb:

    FreakY<3Cpp schrieb:

    👍 ... Musst aber double zurückgeben.

    Nö.

    Gut, nicht unbedingt müssen, aber die Warnung

    warning: converting to `int' from `double'

    stört.

    Xebov schrieb:

    das haut aber nicht ganz hin, weil 1=1 2=1, 0=0 und unter 0 gibts nicht.

    Das stimmt schon wie ich es geschrieben hab 😉



  • Xebov schrieb:

    das haut aber nicht ganz hin, weil 1=1 2=1, 0=0 und unter 0 gibts nicht.

    Wer entgegen der Anleitung fib(0) oder fib(-5) aufruft, der bekommt was undefiniertes, das *darf* auch 1 sein.



  • Ich hatte es nur so gesehen das fib(0)=0 ist. Aber is ansich auch egal, man kanns ja so oder so ausrüsten und dem Ersteller gings ja nur um ne Lösung dafür.



  • skullyan schrieb:

    Wie könnte man das sonst lösen?

    da gibt es bestimmt einen ganzen Sack Möglichkeiten- z.B.:

    #include <boost/iterator/iterator_adaptor.hpp>
    #include <iostream>
    
    template< typename T >
    struct basic_fibonacci : public boost::iterator_adaptor< basic_fibonacci< T >, T, const T, boost::bidirectional_traversal_tag >
    {
        basic_fibonacci()
            : iterator_adaptor_( T(1) )
            , m_prev( T(0) )
        {}
        void increment()
        {
            const T next = base() + m_prev;
            m_prev = base();
            base_reference() = next;
        }
        void decrement()
        {
            const T prev2 = base() - m_prev;
            base_reference() = m_prev;
            m_prev = prev2;
        }
        typename super_t::reference dereference() const
        {
            return base_reference();
        }
    private:
        T m_prev;
    };
    typedef basic_fibonacci< int > Fibonacci;
    
    int main ()
    {
        using namespace std;
        Fibonacci f;
        for( int n = 32; n; --n, ++f )
            cout << *f << " ";
        cout << endl;
        for( ; *f > 0; --f ) // .. und rückwärts
            cout << *f << " ";
        cout << endl;
        return 0;
    }
    

    Gruß
    Werner



  • Werner Salomon schrieb:

    ...Werner...

    Ich liebe Werner für seine overpowered Lösungen 😃 👍



  • Wo wir schon dabei sind,

    #include <iostream>
    
    template<unsigned x> struct fib {
      static unsigned long const val = fib<x - 1>::val + fib<x - 2>::val;
    };
    
    template<> struct fib<1> { static unsigned long const val = 1; };
    template<> struct fib<2> { static unsigned long const val = 1; };
    
    int main() {
      std::cout << fib<10>::val << std::endl;
    }
    


  • seldon schrieb:

    Wo wir schon dabei sind,

    #include <iostream>
    
    template<unsigned x> struct fib {
      static unsigned long const val = fib<x - 1>::val + fib<x - 2>::val;
    };
    
    template<> struct fib<1> { static unsigned long const val = 1; };
    template<> struct fib<2> { static unsigned long const val = 1; };
    
    int main() {
      std::cout << fib<10>::val << std::endl;
    }
    

    Hihi, auf sowas habe ich gewartet... hättest du das nicht gepostet hätte ich´s getan 🙂



  • seldon schrieb:

    Wo wir schon dabei sind,

    #include <iostream>
    
    template<unsigned x> struct fib {
      static unsigned long const val = fib<x - 1>::val + fib<x - 2>::val;
    };
    
    template<> struct fib<1> { static unsigned long const val = 1; };
    template<> struct fib<2> { static unsigned long const val = 1; };
    
    int main() {
      std::cout << fib<10>::val << std::endl;
    }
    

    Das geht bei mir nur bis 48. Campers leicht abgewandelte Version:

    double sqrt5 = sqrt(5.0);
    double golden_ratio = (1+sqrt5)/2;
    double fibu(int n)
    {
       return floor(0.5 + pow (golden_ratio, n+1)/sqrt5);
    }
    

    schaffts etwas weiter. 😉



  • Der zeigt die zwei einsen am anfang nicht an, aber alles andere

    int main (void)
    {
        int anzahl;
        cin >> anzahl;
        int n,k=1,j=1;
        cout << "-----" << endl;
        for (int i=0; i<anzahl; i++)
        {
            n=k+j;
            j=k;
            k=n;
            cout << k << endl;
        }
    }
    

Anmelden zum Antworten