Exercícios do Capítulo 6

fat_rec = function(n){
  if((n<0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  if(n == 0) return(1)
  return(n*fat_rec(n-1))
}

fat_rec(5)
## [1] 120
maior_rec = function(v){
  n = length(v)
  if(n == 1) return(v[1])
  w = v[2:n]
  max_w = maior_rec(w)
  if(v[1] > max_w){
    return(v[1])
  }
  return(max_w)
}

maior_rec(c(1,2,5,3,2,5,1,11,2,7))
## [1] 11
# 1. Defina n como o tamanho do vetor v;
# 2. Se n = 1, retorne v[1];
# 3. Retorne v[1] + soma_rec(v[2:n])


soma_rec = function(v){
  n = length(v)
  if(n==1) return(v[1])
  return(v[1]+soma_rec(v[2:n]))
}

soma_rec(c(1,2,4,3))
## [1] 10
# 1. Defina n como o tamanho do vetor v;
# 2. Se n = 1, retorne 1;
# 3. Defina w = v[1:(n-1)];
# 4. max_pos_w = maior_pos_rec(w);
# 5. Se v[n] > w[max_pos_w], retorne n.
# 6. Retorne max_pos__w.

maior_pos_rec = function(v){
  n = length(v)
  if(n == 1) return(n)
  w = v[1:(n-1)]
  max_pos_w = maior_pos_rec(w)
  if(v[n] > w[max_pos_w]){
    return(n)
  }
  return(max_pos_w)
}
maior_pos_rec(c(73,77,22,44))
## [1] 2
fibo_rec = function(n){
  if((n<0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  if(n==1 || n==2) return(1)
  return(fibo_rec(n-1)+fibo_rec(n-2))
}

fibo_rec(8)
## [1] 21
# 1. Caso n não seja natural, retorne erro.
# 2. Se n=0, retorne 0.
# 3. Retorne fibo_rec(n) + soma_fibo_rec(n-1)
soma_fibo_rec = function(n){
  if((n<0)||(n%%1 != 0)) stop("n tem que ser um natural")
  if(n==0) return(0)
  return(fibo_rec(n)+soma_fibo_rec(n-1))
}
soma_fibo_rec(5)
## [1] 12
# 1. Caso n não seja natural, retorne erro.
# 2. Se n=1 ou n=2 retorne 0;
# 3. Retorne 2*dif_2_rec(n-1) + dif_2_rec(n-2) + n
dif_2_rec = function(n){
  if(n == 1 || n == 2) return(0)
  return(2*dif_2_rec(n-1) + dif_2_rec(n-2) + n)
}

dif_2_rec(3)
## [1] 3
# 1. Caso v não for numérico, retorne erro.
# 2. Defina n = tamanho de v.
# 3. Se n = 0, retorne 0.
# 4. Se v[n] = 0, faça aux = 1, caso contrário, aux = 0.
# 5. Defina w = v[-n]
# 6. Retorne aux + conta_nulo_rec(w)


conta_nulo_rec = function(v){
  if(!is.numeric(v)) stop("V precisa ser  um vetor numérico")
  n = length(v)
  if(n == 0) return(0)
  if(v[n]==0){
    aux = 1
  }else{
    aux = 0
  }
  w = v[-n]
  return(aux + conta_nulo_rec(w))
}

conta_nulo_rec(c(0,2,3,0,0,4,0,0))
## [1] 5
# 1. Defina n = tamanho de v.
# 2. Se n = 1, retorne v[1]
# 3. Defina w = v[1:(n-1)]
# 4. Retorne c(v[n],invert_rec(w))


invert_rec = function(v){
  n = length(v)
  if(n==1) return(v[1])
  w = v[1:(n-1)]
  return(c(v[n],invert_rec(w)))
}

vet = 1:5 ; vet
## [1] 1 2 3 4 5
invert_rec(vet)
## [1] 5 4 3 2 1
soma_rec = function(n){
  if((n<0)||(n%%1 != 0)) stop("n tem que ser um natural")
  if(n==0) return(0)
  return(n+soma_rec(n-1))
}

soma_rec(5)
## [1] 15
e_rec = function(n){
  if((n<0)||(n%%1 != 0)) stop("n tem que ser um natural")
  if(n==0) return(1)
  return(1/factorial(n) + e_rec(n-1))
}
e_rec(1)
## [1] 2
e_rec(2)
## [1] 2.5
e_rec(10)
## [1] 2.718282
# 1. Caso n não seja natural, retorne erro.
# 2. Se n=0, retorne 4.
# 3. Retorne (4*(-1)^n)/(2*n+1) + pi_rec(n-1)
pi_rec = function(n){
  if(n == 0) return(4)
  return((4*(-1)^n)/(2*n+1) + pi_rec(n-1))
}
pi_rec(10)
## [1] 3.232316
pi_rec(100)
## [1] 3.151493
pi_rec(1000)
## [1] 3.142592
pi_ = NULL
for(i in 1:100){
  pi_ = c(pi_,pi_rec(i))
}
# Observe a aproximação do número real de pi conforme aumentamos n.

plot(pi_)
abline(h=pi)

# 1. Caso n não seja natural, retorne erro.
# 2. Se n=0, retorne 1.
# 3. Retorne 1/3^n + serie_rec(n-1)
serie_rec = function(n){
  if((n<0)||(n%%1 != 0)) stop("n tem que ser um natural")
  if(n == 0) return(1)
  return(1/3^n + serie_rec(n-1))
}
serie_rec(100)
## [1] 1.5
soma = function(a,b){
  if((a<0)||(a%%1 != 0)) stop("a tem que ser um natural")
  if((b<0)||(b%%1 != 0)) stop("b tem que ser um natural")
  if(a>b) stop("a tem que ser maior que b")
  if(a == b) return(1/3^b)
  return(1/3^a + soma(a+1,b))
}

soma(4,100)
## [1] 0.01851852