Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:



Ähnliche Dokumente
Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Der Task-Manager

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Objektorientierte Programmierung

Excel Funktionen durch eigene Funktionen erweitern.

Erwin Grüner

Übungen Programmieren 1 Felix Rohrer. Übungen

Einführung in die Programmierung

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Schnellanleitung: Verbuchung von Studien- und Prüfungsleistungen

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

Word 2010 Schnellbausteine

Java Kurs für Anfänger Einheit 5 Methoden

Lehrer: Einschreibemethoden

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

Scala kann auch faul sein

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

1 Vom Problem zum Programm

1) Farbsteuergerät in der Nikobus-Software unter Modul zufügen hinzufügen.

Excel Auswertungen in XAuftrag / XFibu

Anleitung zum Herunterladen von DIN-Vorschriften außerhalb des internen Hochschulnetzes

Einführung in die Programmierung

Leichte-Sprache-Bilder

Festigkeit von FDM-3D-Druckteilen

Browsereinstellungen für moneycheck24 in Explorer unter Windows

Dokumentation IBIS Monitor

FORUM HANDREICHUNG (STAND: AUGUST 2013)

Installation des Add-Ins für Lineare Algebra in Microsoft Excel

Stand: Adressnummern ändern Modulbeschreibung

Stapelverarbeitung Teil 1

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

NODELOCKED LIZENZ generieren (ab ST4)

13. Lineare DGL höherer Ordnung. Eine DGL heißt von n-ter Ordnung, wenn Ableitungen y, y, y,... bis zur n-ten Ableitung y (n) darin vorkommen.

Computerarithmetik ( )

Tragen Sie bitte im Anmeldefeld die Daten ein, die Sie von uns erhalten haben.

FH-SY Chapter Version 3 - FH-SY.NET - FAQ -

Informatik Grundlagen, WS04, Seminar 13

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Programmierkurs Java

1 topologisches Sortieren

Übung 9 - Lösungsvorschlag

Hinweise zum elektronischen Meldeformular

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Kapitel MK:IV. IV. Modellieren mit Constraints

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Gezielt über Folien hinweg springen

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

Erweiterungen Webportal

Das Festkomitee hat die Abi-Seite neu konzipiert, die nun auf einem (gemieteten) Share Point Server

Website freiburg-bahai.de

1. Wie viel Zinsen bekommt man, wenn man 7000,00 1 Jahr lang mit 6 % anlegt?

Kleines Handbuch zur Fotogalerie der Pixel AG

REFLEX Zeiterfassung

Österreichische Trachtenjugend

7 Rechnen mit Polynomen

CAQ Software für Ihr Qualitätsmanagement. Ablauf für die Erfassung der Fehler in der Fertigung

Monitore. Klicken bearbeiten

StudyDeal Accounts auf

Benutzerhandbuch - Elterliche Kontrolle

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

Bedingungen. Bedingungen. Bedingungen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Handbuch ECDL 2003 Professional Modul 2: Tabellenkalkulation Vorlagen benutzen und ändern

Statistische Thermodynamik I Lösungen zur Serie 1

Kopfzeile. Inhaltsverzeichnis

Approximation durch Taylorpolynome

Pflegeberichtseintrag erfassen. Inhalt. Frage: Antwort: 1. Voraussetzungen. Wie können (Pflege-) Berichtseinträge mit Vivendi Mobil erfasst werden?

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Einstellen der Makrosicherheit in Microsoft Word

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus:

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

AutoCAD Dienstprogramm zur Lizenzübertragung

Übungsaufgaben Tilgungsrechnung

Nutzung der Onleihe Schritt für Schritt

Statuten in leichter Sprache

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Da die Bedienung des Editors viele Möglichkeiten aufweist, aber auch etwas Übung voraussetzt, haben wir ihm ein eigenes Unterkapitel gewidmet.

TYPO3 Tipps und Tricks

Kontakte Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

A. Ersetzung einer veralteten Govello-ID ( Absenderadresse )

Mathematischer Vorbereitungskurs für Ökonomen

Hinweise zur Benutzung des Programms zur Berechnung der Abiturendnote

ACDSee 10. ACDSee 10: Fotos gruppieren und schneller durchsuchen. Was ist Gruppieren? Fotos gruppieren. Das Inhaltsverzeichnis zum Gruppieren nutzen

Abwesenheitsnotiz im Exchange Server 2010

Verkehrsteilnehmer. Beispiel: Wir betrachten die Modellierung von Handlungskomponenten wie Verkehrsteilnehmern und Straßen.

26. November EFS Übung. Ziele. Zwei Administrator Benutzer erstellen (adm_bill, adm_peter) 2. Mit adm_bill eine Text Datei verschlüsseln

-Virtuelle Jagdfliegerschule- Teamspeak Seite 1 von 6

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Internet online Update (Mozilla Firefox)

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Dieser Text beschreibt die Neuerungen von DaNiS und die Vorgehensweise beim DaNiS-Update.

Transkript:

Ein- und Ausgabe Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen: fun p r i n t T r e e printa t = c a s e t o f Leaf a => ( p r i n t Leaf ; printa a ) Node ( l, a, r ) => ( p r i n t Node ( ; p r i n t T r e e printa l ; p r i n t, ; printa a ; p r i n t, ; p r i n t T r e e printa r ; p r i n t ) ) val printtree = fn : ( a > unit) > a Tree > unit

Ein- und Ausgabe aus Dateien Zur Ein- und Ausgabe aus Dateien stellt das Modul TextIO eine Kollektion von Typen und Funktionen zur Verfügung: type type type type elem = char v e c t o r = s t r i n g instream outstream v a l s t d I n : instream v a l stdout : outstream v a l stderr : outstream

Einlesen aus Text-Dateien Der typ instream repräsentiert Dateien, aus denen man nur lesen kann. Als Sonderfall kann man auch einen String zum Lesen öffnen. v a l openin : s t r i n g > instream v a l openstring : s t r i n g > instream v a l c l o s e I n : instream > u n i t v a l input1 : instream > elem option v a l inputn : instream i n t > v e c t o r v a l endofstream : instream > bool

Schreiben in Text-Dateien Ein outstream dagegen dient zum Schreiben: v a l openout : s t r i n g > outstream v a l openappend : s t r i n g > outstream v a l closeout : outstream > u n i t v a l output : outstream v e c t o r > u n i t v a l output1 : outstream elem > u n i t

4.12.5 Continuations Rekursionsarten Je nach Art der rekursiven Aufrufe unterscheiden wir folgende Arten von Rekursion: End-Rekursion(lineare Rekursion) Bei der Funktionsauswertung gibt es nur einen rekursiven Aufruf. Dieser ist gleichzeitig der Rückgabewert. fun f a c 1 ( n, acc ) = i f n=1 then acc e l s e fac1(n-1,n*acc) fun loop x = i f x<2 then x e l s e i f x mod 2 = 0 then loop(x div 2) e l s e loop(3*x+1)

Rekursionsarten Repetitive Rekursion Es gibt nur einen rekursiven Aufruf, der aber nicht der Rückgabewert ist. fun f a c n = i f n=1 then 1 e l s e n (fac(n-1)) Baumartige (kaskadenartige) Rekursion Es gibt mehrere, nicht verschachtelte rekursive Aufrufe. fun f i b n = i f n=0 then 1 e l s e i f n=2 then 1 e l s e fib(n-1)+fib(n-2) Wilde Rekursion: geschachtelte rekursive Aufrufe fun f n = i f n<2 then n e l s e f(f(n div 2))

Speicherverhalten der repetitiv-rekursiven Funktionen fun fac n = if n=1 then 1 else n*(fac(n-1)) Auswertung fac(3) n 3 Auswertung fac(2) n 2 Auswertung fac(1) n 1 Rückgabe 1 Auswertung n*fac(1) Rückgabe 2 Auswertung n*fac(2) Rückgabe 6 Bei jedem neuen Funktionsauruf muss der aktuelle Aufruf seine lokale Variablen speichern, um diese nach dem Aufruf benutzten zu können = Speicherverbrauch wächst mit Anzahl geschachtelter Aufrufe.

Speicherverhalten der tail-rekursiven Funktionen fun fac1 (n,acc) = if n=1 then acc else fac1(n-1,n*acc) Auswertung fac1(3,1) n 3 Auswertung fac1(2,3) n 2 Auswertung fac1(1,6) n 1 Rückgabe 6 Rückgabe 6 Rekursiver Aufruf = Rückgabewert = Keine Berechnung nach denm Aufruf = Lokale Variablen werden nicht mehr gebraucht = müssen nicht gespeichert werden Rückgabe 6 = Tail-Rekursion hat den besten Speicherverhalten. Es wird zur wilden Rekursion hin immer schlechter.

Eliminierung der repetitiven Rekursion Der typische Fall von repetitiver Rekursion hat die folgende Form: fun f x = i f x = <x 0 > then <v 0 > e l s e <e(x,f(g(x)))> Zum Beispiel bei Fakultät: fun f a c x = i f x = 1 then 1 e l s e x*(fac(x-1)) Hier ist x 0 =1, v 0 =1, g(x)=x-1 und e(x,y)=x*y. Wie wir schon wissen, gibt es auch eine end-rekursive Variante: fun f a c 1 ( x, a ) = i f x=1 then a e l s e f a c 1 ( x 1,x a ) Im allgemeinen Fall kann man f ersetzen durch: fun f 1 ( x, a ) = i f x = <x 0 > then a e l s e f 1 ( g ( x ), e ( x, a ) )

Eliminierung der repetitiven Rekursion fun f x = i f x = <x 0 > then <v 0 > e l s e <e(x,f(g(x)))> fun f 1 ( x, a ) = i f x = <x 0 > then a e l s e f 1 ( g ( x ), e ( x, a ) ) f(x) =e(x, e(g(x), e(g(g(x),... e(g n (x), v 0 )... ))) =x e (g(x) e (g 2 (x) e... (g n (x) e v 0 )... )) f1(x, v 0 )=f1(g(x), e(x, v 0 )) = f1(g(g(x)), e(g(x), e(x, v 0 ))) =... =e(g n (x), e(g n 1 (x),... e(g(x), e(x, v 0 ))... )) =g n (x) e (g n 1 (x) e... (g(x) e (x e v 0 ))... ) = fx = f1(x, v 0 ), wenn e = assoziativ, kommutativ, z.b.: n*((n-1)*(...*(2*1))) = 1*(2*(...*((n-1)*n))) Der zusätzliche Parameter a heißt auch Akkumulator.

Rekursionsarten Vorsicht bei Listenfunktionen: fun f x = i f x=0 then n i l e l s e x : : f ( x 1) fun f 1 ( x, a ) = i f x=0 then a e l s e f 1 ( x 1,x : : a ) Der Listenkonstruktor :: is weder kommutativ noch assoziativ. Deshalb berechnen f x und f1 (x,nil) nicht den gleichen Wert: f 5 ; val it = [5,4,3,2,1] : int list f 1 ( 5, n i l ) ; val it = [1,2,3,4,5] : int list

Rekursionsarten Selbst baumartige Rekursion kann manchmal linearisiert werden: fun f i b n = c a s e n o f 0 = > 0 1 = > 1 n => f i b ( n 1) + f i b ( n 2) fun f i b 1 n = l e t fun i t e r (m, f1, f 2 ) = i f m = n then f 1 e l s e i t e r (m+1, f2, f 1+f 2 ) i n i t e r ( 0, 0, 1 ) end Das läßt sich aber nicht so einfach verallgemeinern!

Continuation-passing Style Continuation-passing Style (CPS) (dt. etwa Fortsetzungen-Durchreichen-Programmierstil) CPS Abstraktion einer Berechnung: Vergangenheit Gegenwart Zukunft Daten d f Fortsetzung c Vergangenheit = Daten d die der aktuellen Verarbeitungsfunktion übergeben werden Gegenwart Zukunft = Eine aktuelle Verarbeitungsfunktion f = Eine Fortsetzungsfunktion c, die den Rest der Berechnung beschreibt (continuation) Die Berechnung liefert c(f(daten)).

Continuation-passing Style Anstelle der Rückgabe eines Wertes als Ergebnis einer Funktion f, wird eine Funktion k mit diesem Wert aufgerufen, die explizit angibt, wie die Berechnung fortgesetzt werden soll. f bekommt die Fortsetzungfunktion(en) als zusätzliche Parameter. Berechnung von a + b c ohne Continuations: fun add ( x, y ) = x + y fun mult ( x, y ) = x y fun compute ( a, b, c ) = add ( a, mult ( b, c ) ) Berechnung von a + b c im Continuation-Passing-Style: fun add1 ( ( x, y ), k ) = k ( add ( x, y ) ) fun mult1 ( ( x, y ), k ) = k ( mult ( x, y ) ) fun compute ( ( a, b, c ), k ) = mult1 ( ( b, c ), fn x => add1 ( ( a, x ), k ) )

Continuation Passing Style: Beispiel Berechnung von a b + c d mit CPS: fun add1 ( ( x, y ), k ) = k ( add ( x, y ) ) val add1 = fn : (int * int) * (int > a) > a fun mult1 ( ( x, y ), k ) = k ( mult ( x, y ) ) val mult1 = fn : (int * int) * (int > a) > a fun compute ( ( a, b, c, d ), k) = mult1 ( ( a, b ), fn x => mult1 ( ( c, d ), fn y => add1 ( ( x, y ), k ) ) ) val compute = fn : (int * int * int * int) * (int > a) > a compute ( ( 1, 2, 3, 4 ), fn x=> x ) ; val it = 14 : int