Datenstrukturen und Algorithmen

Eine Funktion f(x, y) ist definiert als „ist y gleich 0, gib x zurück; andernfalls gib f(y, x mod y) zurück“. Welchen Rückgabewert liefert der Aufruf f(84, 36), und wie oft wird f aufgerufen, den ersten Aufruf eingeschlossen?

  1. ARückgabewert 12, 3 Aufrufe
  2. BRückgabewert 12, 4 Aufrufe
  3. CRückgabewert 6, 3 Aufrufe
Antwort und Erläuterung anzeigen

Antwort: A. Rückgabewert 12, 3 Aufrufe

f(84, 36) ruft f(36, 12) auf, weil 84 mod 36 = 12; dieser Aufruf ruft f(12, 0) auf, weil 36 mod 12 = 0; und da y gleich 0 ist, wird 12 zurückgegeben. Die Aufrufe sind f(84, 36), f(36, 12) und f(12, 0), insgesamt drei; es handelt sich um den euklidischen Algorithmus für den größten gemeinsamen Teiler. Da die Funktion das Ergebnis ihres rekursiven Aufrufs direkt zurückgibt (Endrekursion), kann ein Compiler mit Tail-Call-Optimierung sie in eine Schleife umwandeln, sodass sie keinen weiteren Stack-Speicher belegt, wie tief die Rekursion auch wird.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Datenstrukturen und Algorithmen

  1. Eine Funktion fib(n) für die Fibonacci-Zahlen ist rekursiv definiert als „ist n kleiner oder gleich 1, gib n zurück; andernfalls gib fib(n−1) + fib(n−2) zurück“. Wie oft wird fib beim Aufruf von fib(5) aufgerufen, den ersten Aufruf eingeschlossen?
  2. 8 Yen sollen mit Münzen zu 1 Yen, 4 Yen und 6 Yen bezahlt werden. Welche Aussage über die Zahl der Münzen, die ein Greedy-Algorithmus wählt (der zuerst so viele der größten Münze wie möglich verwendet), im Verhältnis zur kleinstmöglichen Münzzahl ist richtig?
  3. Ein Rucksack mit der Kapazität 8 wird mit Gegenständen aus vier Gegenständen mit (Gewicht, Wert) (2, 3), (3, 4), (4, 5) und (5, 6) gefüllt. Jeden Gegenstand gibt es nur einmal, und Gegenstände lassen sich nicht teilen. Wie groß ist der höchste Gesamtwert bei einem Gesamtgewicht von höchstens 8?
  4. Welche Aussage beschreibt ein Merkmal des Boyer-Moore-Algorithmus zum Suchen eines Musters in einer Zeichenkette richtig?
  5. Ein dynamisches Array legt, wenn ein Element hinzugefügt wird, während es voll ist, einen neuen Bereich mit doppelter Kapazität an und kopiert alle Elemente dorthin. Wie viele Elementkopien entstehen insgesamt, wenn einem leeren Array mit der Kapazität 1 nacheinander 1000 Elemente hinzugefügt werden?