Eine rekursive Funktion



  • int hof_values[200];
    void init_hof_values()
    {
      hof_values[1] = hof_values[2] = 1;
      for (int i = 3; i < 200; ++i)
        hof_values[i] = -1;
    }
    
    int hof(int n)
    {
        assert(n >= 1 && n < 200);
        if (hof_values[n] != -1)
          return hof_values[n];
        int result;
        if ( n < 3 ) 
          result = 1
        else
          result = ( hof ( n - hof (n - 1) ) + hof (n - hof (n - 2) ) ) ;
        hof_values[n] = result;
        return result;
    }
    


  • Danke hat geklappt, aber verstehe

    assert(n >= 1 && n < 200);
    

    nicht ganz. Sonst ist es am Ende so was rausgekommen und funktioniert:

    # include <iostream>
    
    int hof (int);
    int arr[101]={1,1};
    
    int main()
    {
    
    for(int c=2;c<101;c++)
    {
    	arr[c]= -1;
    }
    
     int hof2=hof(100);
     std::cout<<"Hofstaetter Rekursion Ergebniss fuer Zahl 100: "<<hof2<<std::endl;
    
    return 0;
    }
    
    int hof (int n)
    
    	{ 
    	if( arr[n]!=-1)
    	return arr[n];
    	int result;
    	if(n<3)
    		result=1; 
    		else 
     		result=( hof ( n - hof (n - 1) ) + hof (n - hof (n - 2) ) ) ; 
    		arr[n]=result;
    		return result;
    }
    


  • Diese assertation meldet dir zur Debug-Laufzeit Bereichsüber-/unterschreitungen.



  • Bei miener Version kommt für 100 56 raus, stimmt das oder ist da was falsch?

    P.S. Bei mir gings selbst bei 899 (Ich hab das ganze ein wenig ausgeweitet) sehr schnell (1 sek.)

    mfg
    Glamdring



  • Ja bei mir auch 56.
    bei mir ging es aquch so schnell bis 1000.
    P.S. Was ist diese assert? Wozu gehört es? Ist es eine Funktion? Muss man etwas dafür includieren?
    Danke!



  • assert lässt dein Prgramm (in der Debugg-Version) abstürzen, wenn
    die übergebene Bedingung false wird - und meldet, in welcher Funktion
    es abgestürtzt ist. Ganz furchtbar praktsich zum Fehler finden.



  • Taurin schrieb:

    assert lässt dein Prgramm (in der Debugg-Version) abstürzen

    nein. es gibt eine 'Assertion' aus. Meistens ist das eine kleine Meldung wo die Zeile und Datei drinnen steht, in der die Assertion aufgedrehten ist. Meistens wird auch noch der Ausdruck angegeben, der den Fehler verursacht hat.

    Oft wird dann auch noch der Debugger aufgerufen, so dass man recht schnell feststellen kann, was da schief gelaufen ist.

    also absturz wuerde ich es nicht nennen...



  • herrlado schrieb:

    Ist es eine Funktion?

    Nein, ein Präprozessor-Makro. Deshalb befindet es sich auch nicht in std::.

    Muss man etwas dafür includieren?

    -> <cassert>



  • Alles klar, danke



  • Wie wärs damit?

    #include <iostream>
    
    template <unsigned long long n> struct hs {
      static const unsigned long long val = hs<n - hs<n-1>::val>::val + hs<n - hs<n-2>::val>::val;
    };
    struct hs<1> { static const unsigned long long val = 1; };
    struct hs<2> { static const unsigned long long val = 1; };
    
    template <int i> struct do_loop {
      static void run() {
        do_loop<i-1>::run();
        std::cout << i << '\t' << hs<i>::val << std::endl;
      }
    };
    struct do_loop<0> { static void run() { } };
    
    int main() {
      do_loop<100>::run();
    }
    

Anmelden zum Antworten