Funzioni ricorsive
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 50 di 64.
Una funzione ricorsiva richiama sé stessa su una versione più semplice del problema. Ha bisogno di un caso base che restituisca un valore senza richiamare sé stessa, altrimenti non si fermerebbe mai:
fact <- function(n) {
if (n <= 1) return(1)
n * fact(n - 1)
}
print(fact(5))Output:
[1] 120Ogni chiamata attende che quella più piccola finisca: fact(3) calcola 3 * fact(2), che calcola 2 * fact(1), che restituisce 1. Ogni passaggio deve avvicinarsi al caso base:
count_down <- function(n) {
if (n == 0) {
cat("go\n")
return(invisible(NULL))
}
cat(n, "")
count_down(n - 1)
}
count_down(3)Output:
3 2 1 goLa ricorsione è adatta a dati che contengono copie più piccole di sé stessi, come una lista che contiene altre liste. Questa funzione somma ogni numero, a qualsiasi profondità sia annidato:
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)))Output:
[1] 15Una chiamata ricorsiva può anche dividere il problema a metà. La ricerca binaria esamina l’elemento centrale di un vettore ordinato e prosegue nella metà che può contenere il valore cercato:
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))Output:
[1] 4
[1] NASfida
FacileCompleta ricorsivamente count_digits(n). Un numero inferiore a 10 ha 1 cifra; qualsiasi numero più grande ha una cifra in più rispetto a n %/% 10. Non convertire il numero in testo.
Il codice fornito legge un numero intero n (0 o più) e stampa il valore restituito.
Provalo tu
count_digits <- function(n) {
# Escribe tu código aquí
0
}
# Código de entrada/salida proporcionado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
cat(count_digits(as.numeric(input[1])), sep = "\n")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online