User Tools

Site Tools


functions

This is an old revision of the document!


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 Methode, Funktion oder Prozedur. 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.

In den folgenden Beispielen wird die Fakultät einer Zahl berechen. Einmal iterativ und einmal rekursiv.

Bash

#!/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"

C++

#include <iostream>
 
// 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");
}

C#

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 2;
      } 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

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 2;
    } 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)
}

Java

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 2;
        } 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);
    }
}

JavaScript

<!DOCTYPE HTML>
<!-- HTML Grundstruktur -->
<html>
  <body>
    <script>
      // Variable anlegen
      var factorial_iterative = function(n) {
          result = 1;
 
          while (n > 1) {
              result *= n;
              n--;
          }
 
          return result;
      }
      var factorial_recursive = function(n) {
          if(n < 2) {
              return 1;
          } else if (n == 2) {
              return 2;
          } else {
              return n * factorial_recursive(n-1);
          }
      }
 
      num = 5;
 
      res1 = factorial_iterative(num);
      res2 = factorial_iterative(num);
 
      alert("Die Fakultät von "+num+" ist "+res1);
      alert("Die Fakultät von "+num+" ist "+res2);
    </script>
  </body>
</html>

Perl

#!/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 2;
  } 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";

PHP

Python

functions.1498642805.txt.gz · Last modified: 2017/06/28 11:40 by gg