[Beschreibung] [Quelltext] [Erläuterung] [Übung] [Referenz]

Fakultät und Summe

Beschreibung

Die mathematische Funktion Fakultät ist ein Beispiel für eine rekursive Funktion, d.h. für eine Funktion, die sich selber wieder aufruft.
Außerdem wird eine Funktion beschrieben, die die Summe aus einer beliebigen Anzahl von Eingabeargumenten berechnet.

Quelltext


<head>
<script language="JavaScript">
<!--
  function fakult(kk) {
    if(kk > 1) {
      return kk*fakult(kk-1);
    } else {
      return 1;
    }
  }

  function summe() {
    var sum=0;
    for(var ii=0; ii<summe.arguments.length; ii++) {
      sum+=summe.arguments[ii];
    }
    return sum;
  }
//-->
</script>
</head>
</body>
<script language="JavaScript">
<!--
  document.write("1+2+3+4+5 = ");
  document.write(summe(1,2,3,4,5));
  document.write("<br>1*2*3*4*5 = ");
  document.write(fakult(5));
  document.write("<br>die Chance auf einen 6er im Lotto ist 1 : ");
  document.write(fakult(49)/(fakult(6)*fakult(43)));
//-->
</script>
</body>

Erläuterung

Die mathematische Schreibweise für die Fakultät einer positiven ganzen Zahl n ist "n!" und wird berechnet zu "n! = 1 * 2 * 3 * ... * (n-1) * n". Damit gilt "n! = n * (n-1)!", wenn n größer als 1 ist. Diese rekursive Definition wurde im vorliegenden Beispiel in der function "fakult" umgesetzt.

Die function "summe" verarbeitet eine variable Anzahl von Eingabeargumenten. Anders als bei der Definition von "fakult", wo als Übergabeargument eine Variable "kk" angegebene wurde, ist bei der Definition von "summe" kein Argument definiert. Statt dessen wird auf das Array arguments[] zugegriffen, das alle Eingabeargumente enthält.

Mit JavaScript erstellte Funktionen beschränken sich nicht, wie in den beiden vorgestellten Beispielen, nur auf mathematische Funktionen.

Übungsaufgabe

Erstellen Sie eine Funktion, die aus einer beliebigen Anzahl von Eingabeargumenten den größten Wert ermittelt; dabei sollen negative Zahlen vorher in positive Zahlen umgewandelt werden.
Lösung


Referenz

[
function] [return] [arguments-array]

function

Funktionen sind eine nützliches Hilfsmittel, wenn bestimmte Aufgaben innerhalb eines Skripts wiederholt ausgeführt werden müssen.
Außerdem werden sie eingesetzt, um umfangreichere Aufgaben zu strukturieren: diese werden mit Funktionen in kleine, überschaubare "Häppchen" unterteilt.

Bevor eine function aufgerufen wird, muß sie definiert werden. Der allgemeine Aufbau einer solchen Definition ist :

function name(argument1, argument2, ...) {
  Anweisungsblock;
}

Das Schlüsselwort function wird gefolgt vom Namen der Funktion; für den Namen einer Funktion gelten die gleichen Einschränkungen wie für Variablennamen (siehe Seite 04). Anschließend wird eine Liste der Eingabeargumente - eingeschlossen in runden Klammern und getrennt durch Komma - angegeben. Die Liste darf auch aus nur einem oder keinem Argument bestehen, die runden Klammern sind jedoch in jedem Fall erforderlich. Für argument wird jeweils ein Variablenname als Platzhalter für den übergebenen Wert angegeben. Der Anweisungsblock (also eine Folge von JavaScript-Anweisungen, die die eigentliche Arbeit tun) wird von geschweiften Klammern umfaßt.

Eingabeargumente werden an Funktionen "by value" übergeben, d.h. es wird der Wert, und nicht die Variable selber übergeben. Hierzu ein kleines Beispiel:

function increment(kk) {
  kk=kk+1;
}
var ii=1;
increment(ii);
alert(ii);
Es wird der Wert der Variablen "ii" (also "1") an die Variable "kk" in der function "increment" übergeben. In der Funktion wird der Wert von "kk" erhöht und beträgt danach "2". Nach Verlassen von "increment" hat die Variable "ii" unverändert den Wert "1".

Bei der Verwendung von Funktionen ist besonderes Augenmerk auf den Gültigkeitsbereich von Variablen zu richten; hierauf wurde bereits auf Seite 04 hingewiesen. Hierzu zwei fast identische Beispiele :
function add(a1, a2) {   
  kk=a1+a2;
  return kk;
}
ii=1;
kk=2;
summ=add(ii, kk);
alert(kk);
function add(a1, a2) {   
  var kk=a1+a2;
  return kk;
}
ii=1;
kk=2;
summ=add(ii, kk);
alert(kk);
Im linken Beispiel ist die innerhalb der Funktion "add" verwendete Variable "kk" als globale Variable definiert; die Wertzuweisung "kk=a1+a2" setzt den Wert von "kk" auf "3". Die Anzeige des Wertes der (gleichen) globalen Variablen "kk" im Hauptprogramm liefert also "3".
Im rechten Beispiel wurde in der Funktion "add" die Variable "kk" über das Schlüsselwort var als lokale Variable definiert; die Wertzuweisung der lokalen Variablen ändert damit nicht den Wert der globalen Variablen "kk" im Hauptprogramm. Die Anzeige liefert den Wert "2".

Bei rekursiven Programmaufrufen wird den lokalen Variablen bei jedem Aufruf ein eigener (neuer) Speicherbereich zugewiesen.

function-Definitionen werden üblicherweise im <head>-Bereich eines Dokuments abgelegt.
Dies erleichtert die Übersicht und es ist sichergestellt, daß eine Funktion bei ihrer ersten Verwendung auch definiert ist.

Der Aufruf einer Funktion erfolgt durch Angabe des Funktionsnamens und der Übergabeargumente in runden Klammern entweder als einzelne Anweisung oder anstelle einer Variablen in einer Wertzuweisung oder einer Bedingung. Auch wenn keine Übergabeargumente erforderlich sind, sind die runden Klammern anzugeben !

return

Die return Anweisung bewirkt, daß die Abarbeitung einer function beendet wird; es wird zum rufenden Programm zurückgekehrt. Die return-Anweisung kann an beliebiger Stelle des Anweisungsblocks stehen und darf auch mehrfach vorhanden sein. return ist nicht zwingend in einer function erforderlich; nach Abarbeitung des Anweisungsblocks kehrt JavaScript in jedem Fall zum rufenden Programmteil zurück.

Die return-Anweisung kann wahlweise ein Ergebnis zurückliefern; die Anweisung hat dann die Form:
return ergebnis;
Als ergebnis kann sowohl eine Variable oder ein Ausdruck stehen; es sind sämtliche in JavaScript definierten Datentypen als ergebnis zulässig, also nicht nur Zahlenwerte sondern auch logische Werte oder Objekte.

arguments[], arguments.length

Das arguments-Array enthält alle an eine function übergebenen Eingabeargumente. arguments.length gibt die Anzahl der übergebenen Werte an. Die Indizierung des Arrays beginnt bei 0. Wenn z.B. 3 Argumente übergeben wurden, so enthält arguments.length den Wert 3; die eigentliche Übergabewerte werden mit "arguments[0]", "arguments[1]" und "arguments[2]" angesprochen.


Auf der nächsten Seite bauen wie einen Taschenrechner.

home
Erstellt von © Uwe Brinkmann - bingo e.V. - Stand 15.02.97