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)Code from class
code
Week03