Fonctions récursives
Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 50 sur 64.
Une fonction récursive s’appelle elle-même sur une version plus petite du problème. Elle a besoin d’un cas de base qui retourne une valeur sans s’appeler elle-même, sinon elle ne s’arrêterait jamais :
fact <- function(n) {
if (n <= 1) return(1)
n * fact(n - 1)
}
print(fact(5))Sortie :
[1] 120Chaque appel attend que l’appel plus petit soit terminé : fact(3) calcule 3 * fact(2), qui calcule 2 * fact(1), lequel renvoie 1. Chaque étape doit progresser vers le cas de base :
count_down <- function(n) {
if (n == 0) {
cat("go\n")
return(invisible(NULL))
}
cat(n, "")
count_down(n - 1)
}
count_down(3)Sortie :
3 2 1 goLa récursion convient aux données qui contiennent de plus petites copies d’elles-mêmes, comme une liste qui contient des listes. Cette fonction additionne chaque nombre, quelle que soit la profondeur à laquelle il est imbriqué :
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)))Sortie :
[1] 15Un appel récursif peut également diviser le problème en deux. La recherche binaire examine le milieu d’un vecteur trié et continue dans la moitié qui peut contenir la cible :
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))Sortie :
[1] 4
[1] NADéfi
FacileComplétez count_digits(n) récursivement. Un nombre inférieur à 10 comporte 1 chiffre ; tout nombre plus grand comporte un chiffre de plus que n %/% 10. Ne convertissez pas le nombre en texte.
Le code fourni lit un nombre entier n (0 ou plus) et affiche la valeur renvoyée.
Essayez vous-même
count_digits <- function(n) {
# Écrivez votre code ici
0
}
# Code d'entrée/sortie fourni : gardez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(count_digits(as.numeric(input[1])), sep = "\n")
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et flux d’exécution
1Les chaînes en profondeur
Sous-chaînes avec substr()Mise en forme avec sprintf()Scinder et joindreRechercher dans les chaînesRemplacer du texteRécapitulatif - Créateur de nom d'utilisateur4Matrices
Créer des matricesIndexer des matricesRécapitulatifs des lignes et des colonnesArithmétique matricielleRécapitulatif - Plan de salle7La famille Apply
lapply et sapplyMap et mapplyFilter et FindReduceRécapitulatif - Pipeline de données10Structures de contrôle avancées
La fonction switch()ifelse() vectorisérepeat et breakFonctions récursivesRécapitulatif – Classificateur de notes2Recherches par clé-valeur
Recherches dans des vecteurs nommésVérifier les clésAjouter et supprimer des clésParcourir les nomsRécapitulatif - Bureau des stocks5Projet - Carnet de notes
Ajouter des élèvesEnregistrer les notes3Ensembles et comptage
Valeurs uniquesOpérations sur les ensemblesTests d’appartenanceCompter avec table()Récapitulatif - Invités à l’événement6Les fonctions comme valeurs
Fonctions anonymesPasser des fonctionsRetourner des fonctionsFermetures avec étatRécapitulatif - Règles de remise9Data Frames
Créer des Data FramesColonnes et lignesFiltrer les lignesAjouter et trierRécapitulatif - Rapport des ventes12Projet - Suivi des dépenses
Enregistrer les dépensesDépenses totalesEntraînez-vous par vous-même : Compilateur R en ligne