Code from class

code
Week03
Published

January 27, 2026

fibonacci <- function(n, a, b) {
  if (n==1) return(a)
  if (n == 2) return(b)

  fibonacci(n-1, a, b) + fibonacci(n-2, a, b)
}

fibonacci <- function(n, a, b) {
  if (n==1) return(a)
  if (n == 2) return(b)

  fibonacci(n-1, b, a+b)
}

fibonacci(70, 1L,1L) # overflow of integers
fibonacci(70, 1.0,1.0)

print(fibonacci(70, 1.0,1.0), digits=16)



`+` <- function(x, y) {
  if (all(is.character(x) & is.character(y))) {
    return(paste(x, y, sep=""))
  }
  base::`+`(x, y) # can't write x + y here - calls itself
}
rm(`+1`)

p <- 3

`+` <- function(left, right) {
  left <- signif(left, p)
  right <- signif(right, p)
  signif(base::`+`(left, right), p)
}

`*` <- function(left, right) {
  left <- signif(left, p)
  right <- signif(right, p)
  signif(base::`*`(left, right), p)
}

`-` <- function(left, right=0) {
  left <- signif(left, p)
  right <- signif(right, p)
  signif(base::`-`(left, right), p)
}
pi
pi+1


# Assume that you are using 𝛽=10 and 𝑝=3


# What is the relative error of the expression x^2 - y^2
# for 𝑥=3.34,𝑦=3.33
f <- function(x, y, p) {
  x <- signif(x, p)
  y <- signif(y, p)

  signif(signif(x^2,p) - signif(y^2, p), p)
}

(f(3.34, 3.33, p = 3) - f(3.34, 3.33, p = 17))/f(3.34, 3.33, p = 17)

f(3.34, 3.33, p = 17)

# rewrite operators
p <- 3

`-` <- function(e1, e2) {
  e1 <- signif(e1, p)
  e2 <- signif(e2, p)
  signif(base::`-`(e1, e2), p)
}

`^` <- function(e1, e2) {
  e1 <- signif(e1, p)
  e2 <- signif(e2, p)
  signif(base::`^`(e1, e2), p)
}

`+` <- function(e1, e2) {
  e1 <- signif(e1, p)
  e2 <- signif(e2, p)
  signif(base::`+`(e1, e2), p)
}

`*` <- function(e1, e2) {
  e1 <- signif(e1, p)
  e2 <- signif(e2, p)
  signif(base::`*`(e1, e2), p)
}

f <- function(x, y) {
  x^2 - y^2
}

g <- function(x, y) {
  (x+y)*(x-y)
}


f(3.34, 3.33)
g(3.34, 3.33)
rm(`-`)
rm(`^`)
rm(`*`)
rm(`+`)
f(3.34, 3.33)


x <- 4

f <- function(y) {
  y <- x + y
  y
}

library(rlang)
fac <- function(x) {
  if (x <= 1) return(1)
  x*fac(x-1)
}
fac(5)