재귀 함수
Coddy R 여정의 논리와 흐름 섹션에 포함된 레슨. 64개 중 50번째.
재귀 함수는 문제를 더 작은 형태로 만들어 자기 자신을 호출합니다. 자기 자신을 호출하지 않고 반환하는 기저 사례가 필요합니다. 그렇지 않으면 절대 멈추지 않습니다:
fact <- function(n) {
if (n <= 1) return(1)
n * fact(n - 1)
}
print(fact(5))출력:
[1] 120각 호출은 더 작은 호출이 완료될 때까지 기다립니다. fact(3)은 3 * fact(2)를 계산하고, 이는 2 * fact(1)을 계산하며, fact(1)은 1을 반환합니다. 모든 단계는 기저 사례를 향해 진행되어야 합니다:
count_down <- function(n) {
if (n == 0) {
cat("go\n")
return(invisible(NULL))
}
cat(n, "")
count_down(n - 1)
}
count_down(3)출력:
3 2 1 go재귀는 리스트를 담고 있는 리스트처럼 자기 자신의 더 작은 복사본을 포함하는 데이터에 적합합니다. 이 함수는 숫자가 아무리 깊게 중첩되어 있어도 모든 숫자를 더합니다:
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)))출력:
[1] 15재귀 호출은 문제를 절반으로 나눌 수도 있습니다. 이진 탐색은 정렬된 벡터의 중간을 살펴보고 대상 값을 포함할 수 있는 절반에서 계속합니다:
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))출력:
[1] 4
[1] NA챌린지
쉬움count_digits(n)를 재귀적으로 완성하세요. 10 미만의 수는 1자리이고, 더 큰 수는 n %/% 10보다 자릿수가 하나 더 많습니다. 수를 텍스트로 변환하지 마세요.
제공된 코드는 정수 n(0 이상)을 읽고 반환된 값을 출력합니다.
직접 해보기
count_digits <- function(n) {
# 여기에 코드를 작성하세요
0
}
# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
cat(count_digits(as.numeric(input[1])), sep = "\n")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리와 흐름의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러