Özyinelemeli Fonksiyonlar
Coddy'nin R Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 50 / 64.
Özyinelemeli bir işlev, problemin daha küçük bir sürümü üzerinde kendisini çağırır. Kendini çağırmadan geri dönen bir temel durum gerektirir; aksi takdirde hiç durmazdı:
fact <- function(n) {
if (n <= 1) return(1)
n * fact(n - 1)
}
print(fact(5))Çıktı:
[1] 120Her çağrı, kendisinden daha küçük çağrının tamamlanmasını bekler: fact(3), 3 * fact(2) ifadesini hesaplar; bu da 2 * fact(1) ifadesini hesaplar ve bu ifade 1 döndürür. Her adım taban durumuna doğru ilerlemelidir:
count_down <- function(n) {
if (n == 0) {
cat("go\n")
return(invisible(NULL))
}
cat(n, "")
count_down(n - 1)
}
count_down(3)Çıktı:
3 2 1 goÖzyineleme, listeleri içeren bir liste gibi, kendisinin daha küçük kopyalarını barındıran verilere uygundur. Bu işlev, ne kadar derinde iç içe olursa olsun her sayıyı toplar:
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)))Çıktı:
[1] 15Özyinelemeli bir çağrı, problemi ikiye de bölebilir. İkili arama, sıralanmış bir vektörün ortasına bakar ve hedefi içerebilecek yarıda devam eder:
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))Çıktı:
[1] 4
[1] NAGörev
Kolaycount_digits(n) işlevini özyinelemeli olarak tamamla. 10'dan küçük bir sayının 1 basamağı vardır; daha büyük herhangi bir sayının basamak sayısı n %/% 10 değerinin basamak sayısından bir fazladır. Sayıyı metne dönüştürme.
Sağlanan kod, bir tam sayıyı n (0 veya daha büyük) okur ve döndürülen değeri yazdırır.
Kendin dene
count_digits <- function(n) {
# Kodunuzu buraya yazın
0
}
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
cat(count_digits(as.numeric(input[1])), sep = "\n")
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Dizeleri Derinlemesine
substr() ile Alt Dizelersprintf() ile BiçimlendirmeBölme ve BirleştirmeDizelerde AramaMetin DeğiştirmeTekrar - Kullanıcı Adı Oluşturucu4Matrisler
Matris OluşturmaMatrisleri İndekslemeSatır ve Sütun ÖzetleriMatris AritmetiğiTekrar - Oturma Planı10İleri Düzey Kontrol Akışı
switch() FonksiyonuVektörleştirilmiş ifelse()repeat ve breakÖzyinelemeli FonksiyonlarTekrar - Not Sınıflandırıcısı2Anahtar-Değer Aramaları
Adlandırılmış Vektör AramalarıAnahtarları DenetlemeAnahtar Ekleme ve KaldırmaAdlar Üzerinde DöngüTekrar - Hisse Senedi Masası5Proje - Not Defteri
Öğrenci EklemeNotları Kaydetme3Kümeler ve Sayma
Benzersiz DeğerlerKüme İşlemleriÜyelik Testleritable() ile SaymaTekrar - Etkinlik Konukları6Değer Olarak Fonksiyonlar
Anonim FonksiyonlarFonksiyonları GeçirmeFonksiyon DöndürmeDurum Bilgili Closure'larTekrar - İndirim Kuralları9Veri Çerçeveleri
Veri Çerçeveleri OluşturmaSütunlar ve SatırlarSatırları FiltrelemeEkleme ve SıralamaTekrar - Satış Raporu12Proje - Harcama Takipçisi
Harcamaları KaydetmeToplam HarcamaKendi başına pratik yap: Online R derleyicisi