• Keine Ergebnisse gefunden

Übungsblatt12:Python3&C ÜbungenzuComputergrundlagenWS2018/2019

N/A
N/A
Protected

Academic year: 2021

Aktie "Übungsblatt12:Python3&C ÜbungenzuComputergrundlagenWS2018/2019"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Übungen zu Computergrundlagen WS 2018/2019

Übungsblatt 12: Python 3 & C

25. Januar 2019

Allgemeine Hinweise

• Abgabetermin für die Lösungen ist Freitag, 01.02.2019, 11:00 Uhr

• Schickt die Lösungen bitte per Email an Euren Tutor:

Montag 14:00–15:30: Grant Cates ( gcates@icp.uni-stuttgart.de ) Dienstag 9:45–11:15: Kai Szuttor (kai@icp.uni-stuttgart.de)

Dienstag 15:45–17:15: Julian Michalowsky ( jmichalowsky@icp.uni-stuttgart.de ) Mittwoch 15:45–17:15: Patrick Kreissl ( pkreissl@icp.uni-stuttgart.de )

Donnerstag 9:45–11:15: Frank Maier (fmaier@icp.uni-stuttgart.de)

• Die Übungen sollen in Gruppen von jeweils zwei bis drei Leuten bearbeitet werden. Abgaben von Einzelpersonen werden nicht akzeptiert. Bitte gebt nur eine Lösung pro Gruppe ab und nennt in eurer Abgabe alle Mitglieder eurer Gruppe!

Aufgabe 12.1: Python: Funktionen, Rekursionen und Schleifen (7 Punkte)

Auf Blatt 9 habt Ihr bereits (in Pseudocode) eine rekursive und eine nicht-rekursive Funktion (un- ter Benutzung einer Schleife) für die Berechnung der Fakultät geschrieben. Um die Performance- Unterschiede der verschiedenen Implementierungsarten zu verdeutlichen, sollen in dieser Aufgabe zunächst verschiedene Python-Funktionen zur Berechnung der Fibonacci-Zahlen implementiert wer- den, um anschließend deren Laufzeiten zu vergleichen.

12.1.1 Die Sequenz der Fibonacci-Zahlen ist wie folgt definiert:

fib(n) =

 

 

0 falls n = 0

1 falls n = 1

fib(n − 1) + fib(n − 2) sonst

(1)

Schreibe eine Python-Funktion fib1(n), die die n-te Fibonacci-Zahl wie in Gleichung 1 be- rechnet. (1 Punkt)

12.1.2 Schreibe eine Funktion fib2, die die Fibonacci-Zahlen mit Hilfe einer Schleife berechnet, also ohne den rekursiven Aufruf der Funktion. (2 Punkte)

Hinweis: Berechne zunächst auf dem Papier von Hand die ersten paar Fibonacci-Zahlen. Das macht es einfacher, zu verstehen, wie man die Schleife implementieren kann.

1

(2)

12.1.3 Eine andere, aber äquivalente, Definition der Fibonacci-Zahlen sieht so aus:

fib

a,b

(n) =

 

 

a falls n = 0

b falls n = 1

fib

b,(a+b)

(n − 1) sonst

(2)

fib(n) = fib

0,1

(n) (3)

Schreibe eine Python-Funktion fib3, die die Fibonacci-Zahlen wie in Gleichung 3 berechnet.

(2 Punkte)

Hinweis: Am besten definierst Du die Indizes a und b in Python als optionale Parameter:

def f i b 3 ( n , a =0 , b = 1 ) :

# H i e r kommt d e r Code !

12.1.4 Berechne mit Hilfe der Funktionen fib1 , fib2 und fib3 aus den vorigen Aufgaben die Fibonacci-Zahlen für n ∈ (0, 1, 2, . . . 34, 35). Miss dabei jeweils die Laufzeiten der einzelnen Funktionsaufrufe und plotte mit Matplotlib diese Zeiten über n. Was fällt Dir bei den Laufzeiten auf? Wieso sind sie so unterschiedlich? (2 Punkte)

Hinweis: Die Laufzeit eines Funktionsaufrufs lässt sich mit dem Python-Modul timeit messen:

i m p o r t t i m e i t

def f ( x ):

# I r g e n d e i n Code , d e s s e n P e r f o r m a n c e w i r g e r n e m e s s e n w o l l e n

for n in r a n g e ( 1 0 ) :

t i m i n g = t i m e i t . t i m e i t ( " f ( n ) " ,

s e t u p = " f r o m _ _ m a i n _ _ i m p o r t f , n ", n u m b e r = 1 0 0 ) / 1 0 0 .

p r i n t ( t i m i n g )

Beachte, dass aufgrund der Funktionsweise des timeit-Moduls der Funktionsaufruf f(n) als String übergeben wird und zudem sowohl die Funktion f als auch die zu übergebende Variable n aus dem Hauptteil des Skripts (__main__) importiert werden müssen. Diese Anweisung wird mittels des Arguments setup ebenfalls als String übergeben.

Je nach übergebenem Argument n kann die Laufzeit eines einzelnen Funktionsaufrufs f(n) mit- unter sehr kurz sein. Um hierbei die Statistik zu verbessern kann die timeit -Funktion mit dem Argument number=<xy> angewiesen werden, den gewünschten Aufruf mehrfach auszuführen.

Der übergebenen Funktionsaufruf wird nun number Mal ausgeführt und die dafür benötigte Zeit in Sekunden zurückgegeben. Um die Laufzeit pro Funktionsaufruf zu erhalten muss daher noch durch number (im Beispiel 100) geteilt werden. Miss in deinem Skript die Laufzeiten am Besten zunächts mit number=1 und passe die Variable nach Bedarf an.

Aufgabe 12.2: C (3 Punkte)

12.2.1 Schreibe ein C-Programm fib1, das eine Ganzzahl n von der Standardeingabe einliest, die n-te Fibonacci-Zahl entsprechend Gleichung 1 berechnet und diese auf der Standardausgabe ausgibt. (2 Punkte)

12.2.2 Schreibe das C-Programm fib1 zu fib2 um, so dass es eine Ganzzahl n von der Stan- dardeingabe einließt, die n-te Fibonacci-Zahl entsprechend Aufgabe 12.1.2 unter Verwendung einer Schleife berechnet und das Ergebnis auf der Standardausgabe ausgibt. (1 Punkt)

2

Referenzen

ÄHNLICHE DOKUMENTE

Insbesondere kommen die Fibonacci-Folge und die Lucas-Folge

Aus der Bedingung der Flächengleichheit ergibt sich für die andere Kathete des zweiten Dreiecks 1 2 und für die Hypotenuse 5 2.. Ent- sprechend fahren wir

Es werden allerdings nicht alle pythagoreischen Tripel generiert... Jedes pythagoreische Dreieck ist zwei

Die zu den Tripeln gehörenden Dreiecke nähern sich eben- falls einem rechtwinklig gleichschenkligen Dreieck an.. Die beiden Kathetenlängen un- terscheiden sich immer nur

In this case the proportion of the golden section can be constructed in a square lattice, using circles going through lattice points.?. This gives

In dieser Situation liegen der Mittelpunkt dieses dritten Kreises und die beiden Schnitt- punkte der ersten beiden Kreise im Verhältnis des goldenen Schnittes. Der längere Abschnitt,

Das am linken Rand unten vorstehende kleine Schnipsel ist ähnlich zu den beiden Drei- ecken und damit ebenfalls ein pythagoreisches Dreieck?. 4

Jedes Folgenglied ist also eine Linearkombination der beiden vorangehenden Folgen- glieder (Walser 2012, S.15).. Der Grenzwert der Folge soll aber von null