Menu
Coddy logo textTech

Ö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] 120

Her ç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] NA
challenge icon

Görev

Kolay

count_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")
quiz iconKendini test et

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

Kendi başına pratik yap: Online R derleyicisi