wie lautet der algorithmus?



  • es geht um folgenden quellcode:

    C#include <iostream>
    using namespace std;
    int f1(int a);
    int f2(int a);
    
    void main (void)
    { int a=0;
      int b=1;
      for (int count =-10; count <=0; ++ count)
      {b+=f1(a) + f2(a);
      cout << b << endl;
      }
    }
    
    int f1(int a)
    {int b;
    b=f2(a);
    return (b);
    }
    int f2 (int a)
    {static int b=-5;
    b+=1;
    return (b+a);
    }
    

    warum es 11 durchgägne gibt ist klar, aber ich versteh nicht ganz was genau da abläuft.
    b+= f1(a) + f2(a) bedeutet doch b= b+ f1 + f2 oder?
    doch was genau geschieht in de einzelnen funktionen?
    f1 setzt doch infach nur b als f2 gleich oder?
    wäre nett wenn mir einer den ersten durchlauf der "-6" ausgibt erklären kann 🙂



  • Schritt 1 - Aufräumen:

    #include <iostream>
    
    using namespace std;
    
    int f1(int a);
    int f2(int a);
    
    int main (void)
    { 
    	int a=0;
    
    	int b=1;
    
    	for (int count =-10; count <=0; ++ count)
    	{
    		b+=f1(a) + f2(a);
    
    		cout << b << endl;
    	}
    
    	return 0;
    }
    
    int f1(int a)
    {
    	int b;
    
    	b=f2(a);
    
    	return (b);
    }
    
    int f2 (int a)
    {
    	static int b=-5;
    
    	b+=1;
    
    	return (b+a);
    }
    

    Schritt 2 - Kürzen:

    #include <iostream>
    
    using namespace std;
    
    int f1(int a);
    int f2(int a);
    
    int main (void)
    { 
    	int a=0;
    
    	int b=1;
    
    	for (int count =-10; count <=0; ++ count)
    	{
    		b+=f1(a) + f2(a);
    
    		cout << b << endl;
    	}
    
    	return 0;
    }
    
    int f1(int a)
    {
    	return f2(a);
    }
    
    int f2 (int a)
    {
    	static int b=-5;
    
    	b+=1;
    
    	return (b+a);
    }
    

    Schritt 3 - Kürzen:

    #include <iostream>
    
    using namespace std;
    
    int f1(int a);
    
    int main (void)
    { 
    	int a=0;
    
    	int b=1;
    
    	for (int count =-10; count <=0; ++ count)
    	{
    		b+=f1(a) + f1(a);
    
    		cout << b << endl;
    	}
    
    	return 0;
    }
    
    int f1 (int a)
    {
    	static int b=-5;
    
    	b+=1;
    
    	return (b+a);
    }
    

    Dann noch static nachschlagen und der Rest müsste eigentlich klar sein... Fakt ist, dass f1 ursprünglich nur f2 aufgerufen hat. Die Funktionen waren also gleich.


  • Mod

    Variablen in Funktionen haben miteinander nichts zu tun, auch wenn sie den gleichen Namen haben. Ferner ist das Verhalten undefiniert. f2 hat Nebeneffekte. Da f1 auch f2 aufruft, hat auch f1 Nebeneffekte. Beide Funktionen f1 und f2 stehen gemeinsam in einem Ausdruck, dessen Auswertungsreihenfolge nicht festgelegt ist. edit: Da f1 aber sonst nichts macht, außer f2 aufzurufen und die Addition assoziativ ist, kommt trotzdem am Ende ein definiertes Ergebnis heraus.



  • Der Algorithmus erzeugt eine arithmetische Folge zweiter Ordnung.

    Sei b_0=1 und b_1=-6 (-6 wird als erstes Ergebnis ausgegeben), so kann man die Folgeglieder entweder durch Rekursion bestimmen:
    b_(n+1)=2*b_n-b_(n-1)+4

    oder durch ein Polynom zweiter Ordnung
    b_(n)=2*n^2 - 9*n + 1


Anmelden zum Antworten