Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1415:j_b

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1415:j_b [2014/11/04 15:04]
mr.lazy
ws1415:j_b [2021/04/28 10:47] (aktuell)
stefanborn Seitename wurde von ws1415:jonas_blochwitz auf ws1415:j_b geändert
Zeile 1: Zeile 1:
-====== ​Jonas Blochwitz ​====== +====== ​Beitrag eines Teilnehmers von Mathesis (J.) ====== 
-Funktionen sind toll!+ 
 +Das [[rekursivekunst|hier]] ist eine echt tolle Seite über **Rekursive Kunst**. Du weißt nicht, was das ist? Dann schau doch mal rein! 
 + 
 +===Funktionen sind toll!===
 <code python> <code python>
-#Das hier ist ein eher sinnloses ​Beispiel ​einer Funktion, die rekursiv die Fakultät ​einer Zahl berechnet.+#Das hier ist ein Beispiel ​fuer eine Funktion, die rekursiv die Fakultaet ​einer Zahl berechnet.
 def fakultaet(x):​ def fakultaet(x):​
- if (x <1):+ if (x == 0):
  return 1  return 1
  else:  else:
  return x*fakultaet(x-1)  return x*fakultaet(x-1)
 </​code>​ </​code>​
 +Um nun zu zeigen, warum Funktionen so nützlich sind, wollen wir das folgende Programm betrachten, welches den Binomialkoeffizienten $\binom nk$ berechnet.
 +Dabei gilt Folgendes: ​
 +$$\binom nk = \frac{n!}{k! \cdot (n-k)!}$$
 +Wir müssen also gleich drei mal die Fakultät berechnen((Natürlich könnte man hier n! mit (n-k)! kürzen und sich so eine Forschleife sparen.)). Also gut, legen wir los. Zuerst einmal ohne die Nutzung irgendwelcher Funktionen:
 +<code python>
 +input = raw_input('​Bitte n und k eingeben:'​)
 +k, n = [int(num) for num in input.split()]
 +bnk = 0
 +#berechne zuerst die drei Fakultaeten.
 +nfak, kfak, nkfac = 1,1,1
 +#Achtung, die range-Funktion schliesst das letzte Element nicht ein, '​0'​ aber dafür schon.
 +for i in range(1,n + 1):
 + nfak*=i
 +for i in range(1,k + 1):
 + kfak*=i
 +for i in range(1,n - k + 1):
 + nkfak*=i
 +#Nun können wir den den Binomialkoeffizienten berechnen:
 +bnk = nfak/​(kfak*nkfak)
 +print '​Binomialkoeffizient von', n, '​ueber',​ k, '​ist:',​ bnk
 +</​code>​
 +Nun noch einmal das Ganze, aber mit Nutzung unserer tollen Fakultäts-Funktion:​
 +<code python>
 +def fakultaet(x):​
 + if (x == 0):
 + return 1
 + else:
 + return x*fakultaet(x-1)
 +
 +input = raw_input('​Bitte n und k eingeben:'​)
 +k, n = [int(num) for num in input.split()]
 +bnk = fakultaet(n)/​(fakultaet(k)*fakultaet(k-n))
 +print '​Binomialkoeffizient von', n, '​ueber',​ k, '​ist:',​ bnk
 +</​code>​
 +Nicht nur, dass der Quelltext viel kürzer und leichter zu verstehen ist, er ist auch sehr viel einfacher zu warten.
 +Nehmen wir an, wir wollten jedes mal, wenn die Fakultät einer Zahl berechnet wurde, einen Zähler erhöhen, um irgendwelche Statistiken zu ermitteln. Wir würden also die Zeile:
 +<code python>
 +fakultaetszaehler += 1
 +</​code>​
 +beim ersten Beispiel 3mal einfügen, beim '​ordentlichen'​ Beispiel jedoch nur einmal((Das funktioniert natürlich nicht so einfach, wir haben ja die Variable nirgendwo angelegt. Wir nehmen der Einfachkeit halber aber einfach mal an, dass das hier nur ein Ausschnitt aus einem größerem Programm ist, in dem das alles geregelt ist und vielleicht sogar in eine Datei geschrieben wird.)). Stellen wir uns nun vor, wir wollen etwas kompliziertere Operationen mit dem Fakultätszähler((Hier ermpfiehlt es sich fast schon, eine eigene Funktion dafür zu definieren und diese dann jedes Mal aufzurufen)) durchführen,​ wenn wir eine Fakultät berechnen. Dies könnte sehr schnell zu einem sehr unübersichtlichen Code führen:
 +<code python>
 +def fakultaet(x):​
 + if (x == 0):
 + fakultaetszaehler += 1
 + #Hier
 + #koennten
 + #noch
 + #ein
 + #paar
 + #​komplizierte
 + #​Rechnungen
 + #stehen
 + return 1
 + else:
 + return x*fakultaet(x-1)
 +
 +input = raw_input('​Bitte n und k eingeben:'​)
 +k, n = [int(num) for num in input.split()]
 +bnk = fakultaet(n)/​(fakultaet(k)*fakultaet(k-n))
 +print '​Binomialkoeffizient von', n, '​ueber',​ k, '​ist:',​ bnk
 +</​code>​
 +sieht aber immer noch besser aus als:
 +<code python>
 +input = raw_input('​Bitte n und k eingeben:'​)
 +k, n = [int(num) for num in input.split()]
 +bnk = 0
 +#berechne zuerst die drei Fakultaeten.
 +nfak, kfak, nkfac = 1,1,1
 +#Achtung, die range-Funktion schliesst das letzte Element nicht ein, '​0'​ aber dafür schon.
 +for i in range(1,n + 1):
 + nfak*=i
 + fakultaetszaehler += 1
 + #Hier
 + #koennten
 + #noch
 + #ein
 + #paar
 + #​komplizierte
 + #​Rechnungen
 + #stehen
 +for i in range(1,k + 1):
 + kfak*=i
 + fakultaetszaehler += 1
 + #Hier
 + #koennten
 + #noch
 + #ein
 + #paar
 + #​komplizierte
 + #​Rechnungen
 + #stehen
 +for i in range(1,n - k + 1):
 + nkfak*=i
 + fakultaetszaehler += 1
 + #Hier
 + #koennten
 + #noch
 + #ein
 + #paar
 + #​komplizierte
 + #​Rechnungen
 + #stehen
 +#Nun können wir den den Binomialkoeffizienten berechnen:
 +bnk = nfak/​(kfak*nkfak)
 +print '​Binomialkoeffizient von', n, '​ueber',​ k, '​ist:',​ bnk
 +</​code>​
 +Man sieht also - selbst an diesem sehr konstruiertem,​ an-den-Haaren-herbeigezogenem Beispiel - dass die Nutzung von Funktionen viele Vorteile bietet:
 +  * Der Code ist übersichtlicher und leichter verständlich
 +  * Der Code ist leichter zu warten und zu verbessern
 +  * Der Code ist wesentlich kürzer
  
 ---- ----
  
 +Das war es erst einmal zu Funktionen, aber vielleicht kommt hier ja nochwas dazu! 
ws1415/j_b.1415109847.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)