• Keine Ergebnisse gefunden

5 Funktionen – näher betrachtet

N/A
N/A
Protected

Academic year: 2022

Aktie "5 Funktionen – näher betrachtet"

Copied!
20
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Char ist ein Modul, der Funktionalität für char sammelt :-)

Ein Konstruktor, der mit

definiert wurde, hat die Funktionalität — muss aber stets angewandt vorkommen ...

!" $#%'&"(!) &

*"!+# , -.&

(/$0213#0465

7

(0

# &8 -9:

; ) < -.&

(/$0213#04

: - =8)& >?-@>

A

-': - * =8)& >?-@>

=8)& ,

$

# *"&8B##

-C#

0

7

(0

# &8 ($#; D

! -.&

*CE";BF -@

0 ,G<

(2)

Datentypen können auch rekursiv sein:

B :

C;B

-9 1

0 B :

84

-9 1 , 5

-9 1 E@5 C;B8446

B :

-9 1 , 5

-9 1 E@5 C;B844

Beachte die Ähnlichkeit zu Listen ;-)

(3)

Rekursive Datentypen führen wieder zu rekursiven Funktionen:

: &8! )B# .(!

1 5 C;B84 B,

1 < 5

-9 1 * 5844 *

1 5

-9 1 5 &8B#%$44 )B# 1 B, 5 &8B#%$46

A

-': )B#

0 B :

0 .(

)B# 1 5

-9 1 , 5

-9 1 E@5 C;B84446

0 B,

)B# 1 E@5

-9 1 , 5

-9 1 E@5

-9 1@5

-9 1 , 5 C;B8444446

0

(4)

Anderes Beispiel:

: &8! &"(0)& .(!

< C;B

-9 1 5 &"(0)& 1 B,446

A

-': &"(0)&

0 B :

.(

&"(0)&

B :

-9 1 5

-9 1 5

-9 1 E@5

-9 1 , 5 C;B844446

&"(0)& B,

8-B!

A

&0B: 9D ;.(&

A

-':( -

1 :

&8!G(&#

84

(5)

Der Options-Datentyp

Ein eingebauter Datentyp in Ocaml ist 0 mit den zwei Konstruktoren und /$ .

>?- 0

/$ ,G<

0 0

/$ ,G<

(6)

Er wird häufig benutzt, wenn eine Funktion nicht für alle Eingaben eine Lösung berechnet:

: &8! )B# .(!

1 5 C;B84

1 < 5

-9 1 * 5844

/$ *

1 5

-9 1 5 &8B#%$44 )B# 1 B, 5 &8B#%$46

A

-': )B#

0 B :

0 0

.(

)B# 1 5

-9 1 , 5

-9 1 E@5 C;B84446

0 0

)B# 1 E@5

-9 1 , 5

-9 1 E@5

-9 1@5

-9 1 , 5 C;B8444446

0 0

/$

(7)

5 Funktionen – näher betrachtet

• Rekursionsarten

• Funktionen höherer Ordnung

Currying

→ Partielle Anwendung

• Polymorphe Funktionen

• Polymorphe Datentypen

• Namenlose Funktionen

• Unendliche Datenstrukturen

(8)

5.1 Rekursionsarten

Je nach Art der rekursiven Aufrufe unterscheiden wir folgende Arten von Rekursion:

1. End-Rekursion: Jeder rekursive Aufruf liefert gleichzeitig den Rückgabewert.

: &8! -B!), .(!

1 , 5?-B!!4 -B!!

1 5?-B!!4 -B!), 1 B, 5 -B!!46

: &8! : * *8 E *

:B#

* /$ ; E < : 1 * E)4

:B# : 1 * ,46

(9)

2. Repetitive Rekursion: Es gibt in jedem Zweig höchstens einen rekursiven Aufruf.

: &8! -B! .(!

, ,

-B! 1 B,46

3. Allgemeine Rekursion:

: &8! 7 .(!

< ,

, ,

7 1 B,4 7 1 E)46

: &8! E

:B# 1? 1 E)446

(10)

Das beste Speicherverhalten hat die End-Rekursion. Es wird zur allgemeinen Rekursion hin immer schlechter.

Der typische Fall von repetitiver Rekursion hat die folgende Form:

: &8! * 21 *4

A

:B# 1 * 5 @1

1 *44

Beispiel: Fakultät

: &8! -B! * *0 , , :B# * -B! 1 *B,4

Hier ist 21 *4

*0 ,

, A

, , 1 *4

*B, und 1 * 5 $4

*

.

(11)

Wie wir gesehen haben, gibt es auch eine end-rekursive Variante:

: &8! -B!), 1 * 5?-)4 *0 , - :B# -B!), 1 *B, 5 * -)4

Im allgemeinen Fall kann man ersetzen durch:

: &8! , 1 * 5?-)4 21 *4 - :B# , 1 1 *465 1 * 5?-)44

Dann ist ,$1 * 5 A 4 gleich * — aber nur dann, wenn eine assoziative, kommutative Funktion ist:

618 61 E ),44 , 61 E 618 G 44

Der zusätzliche Parameter - heißt auch Akkumulator.

(12)

Vorsicht bei Listenfunktionen:

: &8! * *00<

:B# * 1 *B,4

: &8! , 1 * 5?-)4 *00< - :B# , 1 *B, 5 * -)4

Der Listenkonstruktor is weder kommutativ noch assoziativ.

Deshalb berechnen * und , 1 * 5 4 nicht den gleichen Wert:

@

0 :

#% @ E@ ,

, 1@5

46

0 :

#% , E@

(13)

Selbst allgemeine Rekursion kann manchmal linearisiert werden:

: &8! 7 .(!

< ,

, ,

7 1 B,4 7 1 E)46

: 7 ,

: &8!

)& * 1 /+< 5 / ,4

*8 , / , :B#

)& 1 *B,4 1 / , 5 /+< / ,4

)& 1 , 5 ,4

Das lässt sich aber nicht so einfach verallgemeinern :-)

(14)

5.2 Funktionen höherer Ordnung

Betrachte die beiden Funktionen

: 1 -@5

7 4 - 7 ,

:

- 7 - 7 ,

Auf den ersten Blick scheinen sich und nur in der Schreibweise zu unterscheiden. Aber sie haben einen anderen Typ:

2

0

0

0 .(

0

0

0 .(

(15)

• Die Funktion hat ein Argument, welches aus dem Paar 1 -@5 7 4 besteht. Der Rückgabewert ist - 7 , .

hat ein Argument - vom Typ 0 . Das Ergebnis einer Anwendung auf - ist wieder eine Funktion, welche,

angewendet auf ein weiteres Argument 7 , das Ergebnis - 7 , liefert:

1 5 )46

0

:

,

A

-':

,

0

0 .(

, @

0

(16)

Haskell B. Curry, 1900–1982

(17)

Das Prinzip heißt nach seinem Erfinder Haskell B. Curry Currying.

heißt Funktion höherer Ordnung, weil ihr Ergebnis wieder eine Funktion ist.

→ Die Anwendung von auf ein Argument heißt auch partiell, weil das Ergebnis nicht vollständig ausgewertet ist, sondern eine weitere Eingabe erfordert.

Das Argument einer Funktion kann auch wieder selbst eine Funktion sein:

: -9: - 7 1 -@5

7

46

A

-': -9: 1>?- > 7

> !4 >?- > 7

> ! .(

(18)

: :($# 1 * 5 $4 *"

A

-': :($#

0

0

0 .(

-9: :($#

0

0

0 .(

: :($#.E -9: :($# E@

A

-': :($#.E

0

0 .(

: :($# -9: :($#

A

-': :($#

0

0 .(

:($#.E 1 :($# 46

0

(19)

5.3 Funktionen als Daten

Funktionen sind Daten und können daher in Datenstrukturen vorkommen:

11 465 :($# 4

1

0

0

0$4 1

0

0$4 1 .( 5 .(846

: &8! :($# :

#% .(!

* *# 1 4 * :($# :

#% *#

A

-': :($# :

#%

0 :

#% 1

0

0$4 :

#% .(

: : :($# :

#% , ?E@

A

-': : 1

0

0$4 :

#% .( .( .(

(20)

: ;B -";;

: &8! -";; :

#% .(!

# -";; :

#% #

-";; :

#%

A

-': ;B -";; >?- 1>?- > 7 4 :

#% > 7 :

#% .(

;B -";; :

0 :

#%

: &8! # (/ .(!

<

# 13# (/ #046

A

-': # (/ 1

0

0$4 :

#%

0 .(

# (/ :

0

Referenzen

ÄHNLICHE DOKUMENTE

 Dann ist a sicher kein Präfix von s , falls sich die ersten Elemente z und x unterscheiden, das Ergebnis false der Funktion ist also korrekt.. Fall: der Parameter a ist

Enklave, Staffellandschaft Diese sagen an sich nur aus, daß etwas in Bewegung ist, nicht aber in welche Richtung sich die Ausbreitung vollzieht. Man

❚ Mit anderen Worten: Das Ergebnis von odd(2) wird nicht weiter verrechnet, sondern direkt als Wert von even(3) zurückgegeben (Tail-Call).. ❚ Die lokalen Variablen für even(3)

ist wieder proportional zur Anzahl der Vergleiche *left &lt; *right ( das muss man aber nicht sofort sehen). Alle Vergleiche werden von der Funktion

Rekursive Funktionen bestehen immer aus den folgenden Bestandteilen: I mindestens ein Basisfall, in dem die Rekursion abbricht und das Ergebnis fest steht I mindestens ein

→ Die Anwendung von g auf ein Argument heißt auch partiell, weil das Ergebnis nicht vollständig ausgewertet ist, sondern eine weitere Eingabe erfordert.. Das Argument einer

Das Innere des Brustkorps ist mit einer Haut ausgekleidet – dem Rippenfell. Auch die Lunge ist mit einer Haut überzogen – Lungenfell. Zwischen den 2 Häuten befindet sich

Namensketten sind ringförmige Schnüre, auf die kleine Würfel aufgereiht sind. Auf jedem Würfel ist ein Großbuchstabe aufgedruckt. In dieser Aufgabe wollen wir solche Ketten