(Textbook: Section 16.1)
A recursive function is a function that contains a call to itself in its own body.
\(n\) people are in a room. Each person shakes the hand of each other person. How many handshakes are there?
The Fibonacci numbers are defined as follows:
Can we write a function to compute the \(n\)-th Fibonacci number, for any \(n \geq 1\)?
Recall()Recursive functions are often written to call themselves using their own names:
This works, but it can be dangerous. Why?
To see the countdown and Fibonacci functions (plus some other recursive functions) at work in an interactive way, consult this app.
Recall conversion to any desired base:
to_base <- function(b, n) {
if (b > 36) stop("choose a lower base")
digits <- c(0:9, letters)[1:b]
numeral <- ""
curr <- n
while (curr >= b) {
quot <- curr %/% b
rem <- curr %% b
numeral <- str_c(digits[rem + 1], numeral, sep = "")
curr <- quot
}
str_c(digits[curr + 1], numeral, sep = "")
}
to_base(7, 5463)[1] "21633"
[1] 55
Seems to work just fine.
Try:
Takes a scary long time to finish.
Donβt even bother with:
The number of recalls that fib() must make grows exponentially with the size of n.
Letβs investigate this:
investigate_calls <- function(n) {
counter <- 0
fib2 <- function(n) {
counter <<- counter + 1
if (n %in% c(1, 2)) {
return(1)
}
Recall(n - 1) + Recall(n - 2)
}
fib_number <- fib2(n = n)
cat("The number of calls to compute fib(", n, ") was ", counter, ".\n", sep = "")
cat("2 * fib(", n, ") - 1 equals ", 2 * fib_number - 1, ".\n", sep = "")
}The number of calls made by the fib() function when finding the nth Fibonacci number is:
\[2 \times F_n - 1.\]