Rekursive Funktionen
Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 50 von 64.
Eine rekursive Funktion ruft sich selbst mit einer kleineren Version des Problems auf. Sie benötigt einen Basisfall, der zurückkehrt, ohne sich selbst aufzurufen, sonst würde sie niemals anhalten:
fact <- function(n) {
if (n <= 1) return(1)
n * fact(n - 1)
}
print(fact(5))Ausgabe:
[1] 120Jeder Aufruf wartet darauf, dass der kleinere Aufruf abgeschlossen wird: fact(3) berechnet 3 * fact(2), was 2 * fact(1) berechnet, das 1 zurückgibt. Jeder Schritt muss sich auf den Basisfall zubewegen:
count_down <- function(n) {
if (n == 0) {
cat("go\n")
return(invisible(NULL))
}
cat(n, "")
count_down(n - 1)
}
count_down(3)Ausgabe:
3 2 1 goRekursion eignet sich für Daten, die kleinere Kopien ihrer selbst enthalten, etwa eine Liste, die Listen enthält. Diese Funktion addiert jede Zahl, unabhängig davon, wie tief sie verschachtelt ist:
deep_sum <- function(x) {
if (is.numeric(x)) return(sum(x))
total <- 0
for (item in x) total <- total + deep_sum(item)
total
}
print(deep_sum(list(1, list(2, 3), list(list(4)), 5)))Ausgabe:
[1] 15Ein rekursiver Aufruf kann das Problem ebenfalls in zwei Hälften teilen. Die binäre Suche betrachtet die Mitte eines sortierten Vektors und fährt mit der Hälfte fort, die das Ziel enthalten kann:
find <- function(v, target, lo = 1, hi = length(v)) {
if (lo > hi) return(NA)
mid <- (lo + hi) %/% 2
if (v[mid] == target) return(mid)
if (v[mid] < target) find(v, target, mid + 1, hi) else find(v, target, lo, mid - 1)
}
print(find(c(2, 5, 8, 12, 19), 12))
print(find(c(2, 5, 8, 12, 19), 7))Ausgabe:
[1] 4
[1] NAAufgabe
EinfachVervollständige count_digits(n) rekursiv. Eine Zahl unter 10 hat 1 Ziffer; jede größere Zahl hat eine Ziffer mehr als n %/% 10. Wandle die Zahl nicht in Text um.
Der bereitgestellte Code liest eine ganze Zahl n (0 oder größer) ein und gibt den zurückgegebenen Wert aus.
Probier es selbst
count_digits <- function(n) {
# Schreibe deinen Code hier
0
}
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
cat(count_digits(as.numeric(input[1])), sep = "\n")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik und Ablaufsteuerung
1Strings im Detail
Teilstrings mit substr()Formatierung mit sprintf()Aufteilen und VerbindenStrings durchsuchenText ersetzenWiederholung – Benutzernamen-Generator4Matrizen
Matrizen erstellenMatrizen indizierenZusammenfassungen von Zeilen und SpaltenMatrizenarithmetikRückblick – Sitzplan10Fortgeschrittener Kontrollfluss
Die switch()-FunktionVektorisierter ifelse()repeat und breakRekursive FunktionenRückblick – Notenklassifizierung2Schlüssel-Wert-Suchen
Benannte Vektor-SuchenSchlüssel prüfenSchlüssel hinzufügen und entfernenNamen durchlaufenRückblick – Aktienübersicht5Projekt – Notenbuch
Schüler hinzufügenNoten eintragen3Mengen und Zählen
Eindeutige WerteMengenoperationenZugehörigkeitstestsZählen mit table()Rückblick – Gäste einer Veranstaltung6Funktionen als Werte
Anonyme FunktionenFunktionen übergebenFunktionen zurückgebenClosures mit ZustandRückblick – Rabattregeln9Datenrahmen
Datenrahmen erstellenSpalten und ZeilenZeilen filternHinzufügen und SortierenZusammenfassung – Verkaufsbericht12Projekt – Ausgaben-Tracker
Ausgaben erfassenGesamtausgabenÜbe selbstständig: Online-R-Compiler