====== Funktionen ====== Ab hier wird es spannend. Sollte dir der Kopf noch nicht rauchen - Hier passierts bestimmt. \\ Funktionen sind ein wichtiger Bestandteil, um den Code zu **organisieren**, **lesbarer** und **verständlicher** zu machen. Sie verhindern Codedopplungen und machen das Testen wesentlich einfacher. \\ Je nach Programmiersprache spricht man von Funktion, Methode, Prozedur oder Routine. Der Einfachheit halber wird hier beim Term Funktion geblieben. \\ Funktionen sollte man so kurz wie möglich halten, dafür mehr davon. Das steigert die Lesbarkeit eines Codes enorm. \\ Funktionen können **iterativ** oder **rekursiv** sein. Rekursionen sind recht elegant, für Anfänger aber oft schwer zu verstehen. Eine rekursive Funktion ruft sich selbst mit veränderten Parametern auf. \\ ===== Beispiele ===== In den **folgenden Beispielen** wird die **Fakultät** einer Zahl berechnet. Einmal iterativ und einmal rekursiv. Die Fakultät einer Zahl ist äusserst einfach erklärt. Die Fakultät von 1 ist 1, die Fakultät von 2 ist 2*1, die Fakultät von 3 ist 3*2*1 und so weiter. Die Fakultät wird in der Mathematik auch mit einem ! gekennzeichnet. 4! = 4*3*2*1. Einfach, oder? ==== Bash ==== === Code === #!/bin/bash # Definieren der iterativen Funktion function factorial_iterativ { # Parameter auslesen local n=$1 # Ergebnis Variable anlegen local result=1 # die iterative Berechnung while [ $n -gt 1 ]; do result=$(($result * $n)) let n=n-1 done # das Ergebnis ausliefern echo $result } # und das ist die rekursive Variante function factorial_recursive { # Parameter auslesen local n=$1 # nächsten Parameter berechnen local m=$(($n - 1)) # Abbruchbedingung => parameter ist kleiner als 2. Wir geben einfach 1 zurück. if [ $n -lt 2 ]; then echo 1 # Abbruchbedingung => parameter ist 2. Die Multiplikation mit 1 lassen wir aus elif [ $n -eq 2 ]; then echo $n else # Der rekursive Aufruf echo $(($n * `factorial_recursive $m`)) fi } # Wir wollen die Fakultät von 5 berechnen num=5 # Zuerst iterativ... ret1=$(factorial_iterativ $num) # ...dann rekursiv ret2=$(factorial_recursive $num) # Und dann geben wir das Ergebnis aus echo "Die Fakultät von $num ist $ret1" echo "Die Fakultät von $num ist $ret2" === Ausführen === chmod +x factorial.sh # als ausführbar markieren ./factorial.sh # ausführen ==== C++ ==== === Code === #include // definieren der iterativen variante int factorial_iterative(int n) { // Ergebnisvariable anlegen int result = 1; // solange n > 1 (man könnte auch n >= 2 schreiben) while(n > 1) { // multipliziere das Ergebnis mit n result *= n; // zähle Eins von n weg n--; } // Das Ergebnis zurück geben return result; } // und der rekursiven Variante int factorial_recursive(int n) { // erste Abbruchbedingung => n ist kleiner als 2. if (n < 2) { return 1; } // zweite Abbruchbedingung => n ist gleich zwei else if (n == 2) { return n; } // der rekursive aufruf else { return n * factorial_recursive(n-1); } } int main() { // Die Fakultät von 5 ist gefragt int num = 5; // Die beiden Berechnungen anstellen... int ret1 = factorial_iterative(num); int ret2 = factorial_recursive(num); // ...und deren Ergebnis ausgeben printf("%s%d%s%d%s", "Die Fakultät von ", num, " ist ", ret1, "\n"); printf("%s%d%s%d%s", "Die Fakultät von ", num, " ist ", ret2, "\n"); } === Kompilieren und Ausführen === Die Datei factorial.cpp mit dem obigen Code erstellen g++ -Wall -g -std=c++14 factorial.cpp -o factorial # kompilieren ./factorial # ausführen ==== C# ==== === Code === using System; namespace Functions { class Factorial { public int Factorial_Iterative(int n) { int result = 1; while (n > 1) { result *= n; n--; } return result; } public int Factorial_Recursive(int n) { if (n < 2) { return 1; } else if (n == 2) { return n; } else { return n * Factorial_Recursive(n-1); } } static void Main() { int num = 5; Factorial fr = new Factorial(); int res1 = fr.Factorial_Iterative(num); int res2 = fr.Factorial_Recursive(num); Console.WriteLine("Die Fakultät von "+num+" ist "+res1); Console.WriteLine("Die Fakultät von "+num+" ist "+res2); } } } ==== golang ==== === Code === package main import "fmt" func factorial_iterative(n int) int { result := 1 for (n > 1) { result *= n n-- } return result } func factorial_recursive(n int) int { if(n < 2) { return 1; } else if (n == 2) { return n; } else { return n * factorial_recursive(n-1) } } func main() { num := 5 res1 := factorial_iterative(num) res2 := factorial_recursive(num) fmt.Println("Die Fakultät von ", num, " ist ", res1) fmt.Println("Die Fakultät von ", num, " ist ", res2) } === Kompilieren und Ausführen === Die Datei factorial.go erstellen und so kompilieren und ausführen: go build factorial.go # kompilieren ./factorial # ausführen oder den [[https://tour.golang.org|Online go compiler]] verwenden ==== Java ==== === Code === public class Factorial { private int factorial_iterative(int n) { int result = 1; while(n > 1) { result *= n; n--; } return result; } private int factorial_recursive(int n) { if(n < 2) { return 1; } else if (n == 2) { return n; } else { return n * factorial_recursive(n-1); } } public static void main(String[] args) { int num = 5; Factorial f = new Factorial(); int res1 = f.factorial_iterative(num); int res2 = f.factorial_recursive(num); System.out.println("Die Fakultät von "+num+" ist "+res1); System.out.println("Die Fakultät von "+num+" ist "+res2); } } === Kompilieren und ausführen === Die Datei Factorial.java mit obigen Inhalt erstellen und so zum Laufen bringen: javac Factorial.java java Factorial ==== JavaScript ==== === Code === === Ausführen === Den obigen Code in die Datei factorial.html kopieren und im Browser öffnen ==== Perl ==== === Code === #!/usr/bin/perl sub Factorial_Iterative { my $n = shift; $result = 1; while ($n > 1) { $result *= $n; $n = $n - 1; } return $result; } sub Factorial_Recursive { my $n = shift; if ($n < 2) { return 1; } elsif ($n == 2) { return $n; } else { return $n * Factorial_Recursive($n - 1); } } my $num = 5; my $res1 = Factorial_Iterative($num); my $res2 = Factorial_Recursive($num); print "Die Fakultät von $num ist $res1\n"; print "Die Fakultät von $num ist $res2\n"; === Ausführen === Die Datei factorial.pl mit dem gezeigten Quelltext erstellen und wie folgt ausführen: perl factorial.pl ==== PHP ==== === Code === 1) { $result *= $n; $n--; } return $result; } function factorial_recursive($n) { if($n < 2) { return 1; } else if ($n == 2) { return $n; } else { return $n * factorial_recursive($n - 1); } } $num = 5; $res1 = factorial_iterative($num); $res2 = factorial_recursive($num); echo "Die Fakultät von $num ist $res1\n"; echo "Die Fakultät von $num ist $res2\n"; === Ausführen === Die Datei factorial.php mit dem gezeigten Code füllen und auf folgende Weise ausführen php factorial.php ==== Python ==== === Code === #!/usr/bin/python3 def factorial_iterative(n): result = 1 while(n > 1): result *= n n = n - 1 return result def factorial_recursive(n): if(n < 2): return 1 elif (n == 2): return n else: return n * factorial_recursive(n-1) num = 5 res1 = factorial_iterative(num) res2 = factorial_recursive(num) print("Die Fakultät von "+str(num)+" ist "+str(res1)) print("Die Fakultät von "+str(num)+" ist "+str(res2)) === Ausführen === Die Datei factorial.py mit dem gezeigten Inhalt erstellen und wie folgt ausführen: python3 factorial.py ===== Übungen ===== * Schreibe eine Funktion, die zwei Zahlen multipliziert und das Ergebnis zurück gibt * Schreibe eine Funktion, die prüft, ob eine Zahl gerade oder ungerade ist. Das Ergebnis soll true oder false sein * Schreibe eine Funktion, die prüft, ob eine Zahl ohne Rest durch drei dividierbar ist * Schreibe eine Funktion, die prüft, ob ein Datum korrekt ist * Schreibe eine Funktion, die eine Datei (Parameter ist der Pfad der Datei) ausliest und ausgibt