Ein Anwendungsbeispiel für den Zahlentyp rational und die Funktion summe()

Die Programmiersprache Recapis kennt außer den beiden Zahlentypen integer und float noch den Typ rational. Daher liefert in Recapis z.B. der Ausdruck "1/2+1/6" nicht die Floatzahl 0.6666667 sondern die Bruchzahl 2/3.

Die Funktion summe() hat mit der for-Schleife in C, sowohl syntaktische als auch semantische Ähnlichkeit. Angenommen man möchte die Summe der Quadrate der natürliche Zahlen von 1 bis n in einem geschlossenen Ausdruck verwenden, um z.B. die Richtigkeit der Formel im Vergleich zum schlichten Aufsummieren zu überprüfen mit dem Programm

  if ( summe() == formel() )
       $='Alles OK!';
  else $='Nanu?';
  
Für formel() kann man "n^3/3+n^2/2+n/6" einsetzen. Das schlichte Aufsummieren muss jedoch in einer vorgeschalteten Schleife geschehen.
  n=3;
  sum=0;
  for(i=1;i<=n;i++)
     sum+=i^2;
  if ( sum == int(n^3/3+n^2/2+n/6) )
       $='Alles OK!';
  else $='Nanu?';
  
Mit Recapis kann wie folgt kürzer kodiert werden.
n=3;
if ( summe((i=1),i<=n,i^2) == int(n^3/3+n^2/2+n/6) )
     $='Alles OK!';
else $='Nanu?';
  
Zu beachten:
Die Argumente von summe() werden wie in Funktionen üblich mit Komma gereiht. Das erste Argument muss rundgeklammert werden, weil das Gleichheitszeichen stärker trennt.Da der Formelausdruck eine rationale Zahl liefert, muss sie mit int in Integer gewandelt werden um mit dem Int-Wert von summe typgleich sein zu können.

Mit diesen beiden Eigenschaften lassen sich die rationalen Zahlen des Potenzdreicks potenz.pdf gemäß unten stehender Formel recht übersichtlich berechnen.

Das folgende Programm kann die Formel $$ a_k = \frac{\binom{e}{k} - \sum_{m=0}^{k-1}a_m\binom{e+1-m}{k+1-m}}{e+1-k} $$ einigermaßen schlicht übernehmen
anz=12;
a Rvector (anz+1);
for(e=0;e<=anz;e++){
   $='e = ',"%2d"printf(e),' :\t';
   for(k=0;k<=e;k++){
      a[k]=
              (   biko(e,k) // der Binomialkoeffizient
                - summe ( (m = 0),
                          m <= k-1,
                          a[m] * biko(e+1-m, k+1-m)
                        )
              )
            / (e+1-k);
      $=zaehler(a[k]),'/',nenner(a[k]),'\t';
   }
   $='\n';
}
und produziert diese Ausgabe:
e =  0 :  1/1
e =  1 :  1/2 1/2
e =  2 :  1/3 1/2 1/6
e =  3 :  1/4 1/2 1/4 0/1
e =  4 :  1/5 1/2 1/3 0/1 -1/30
e =  5 :  1/6 1/2 5/12  0/1 -1/12 0/1
e =  6 :  1/7 1/2 1/2 0/1 -1/6  0/1 1/42
e =  7 :  1/8 1/2 7/12  0/1 -7/24 0/1 1/12  0/1
e =  8 :  1/9 1/2 2/3 0/1 -7/15 0/1 2/9 0/1 -1/30
e =  9 :  1/10  1/2 3/4 0/1 -7/10 0/1 1/2 0/1 -3/20 0/1
e = 10 :  1/11  1/2 5/6 0/1 -1/1  0/1 1/1 0/1 -1/2  0/1 5/66
e = 11 :  1/12  1/2 11/12 0/1 -11/8 0/1 11/6  0/1 -11/8 0/1 5/12  0/1
e = 12 :  1/13  1/2 1/1 0/1 -11/6 0/1 22/7  0/1 -33/10  0/1 5/3 0/1 -691/2730

Wenn man HTML-Kode erzeugen will,

\[\frac{1}{1}\qquad\] \[\frac{1}{2}\qquad\frac{1}{2}\qquad\] \[\frac{1}{3}\qquad\frac{1}{2}\qquad\frac{1}{6}\qquad\]
\[\frac{1}{1}\qquad\]
\[\frac{1}{2}\qquad\frac{1}{2}\qquad\]
\[\frac{1}{3}\qquad\frac{1}{2}\qquad\frac{1}{6}\qquad\]

muss das Programm angepasst werden.

anz=3;
B Rvector (anz+1);
for(e=0;e<=anz;e++){
   $='\\[';
   for(i=0;i<=e;i++){
      B[i]=
              (   biko(e,i) // der Binomialkoeffizient
                - summe ( (m = 0),
                          m <= i-1,
                          B[m] * biko(e+1-m, i+1-m)
                        )
              )
            / (e+1-i);
      $='\\frac{',zaehler(B[i]),'}{',nenner(B[i]),'}\\qquad';
   }
   $='\\]\n';
}