Está en la página 1de 38

Informática - Grado en Física 2022-2023

Definiciones Recursivas
Índice de contenidos
I. Introducción
II. Factorial
III. Fibonacci
IV. Bisección
V. Árbol

Informática - Grado en Física - UMU 2


Introducción
“Una función es recursiva cuando ella misma aparece en su propia
definición”
❑Evitar bucle infinito ➔
establecer caso base no
recursivo

❑Muchas funciones matemáticas y procesos computacionales se expresan


de forma natural de esta forma

Informática - Grado en Física - UMU 3


Introducción

Informática - Grado en Física - UMU 4


Factorial
➢Solución “iterativa” (bucle) def fact(n):
p = 1
for k in range (1,n+1) :
p = p*k
return p

fact(3), fact(5)
(6, 120)
➢Con arrays
def fact(n):
return np.product(np.arange(1,n+1))

fact(3), fact(5)
(6, 120)
Informática - Grado en Física - UMU 5
Factorial
➢Solución recursiva (transcribir definición matemática recursiva)

def fact(n):
if n == 0:
return 1
else:
return n*fact(n-1)

Informática - Grado en Física - UMU 6


Factorial
fact(5) =
def fact(n): = 5 * fact(4) =
if n == 0:
return 1 = 5 * 4 * fact(3) =
else: = 5 * 4 * 3 * fact(2) =
return n*fact(n-1) = 5 * 4 * 3 * 2 * fact(1) =
= 5 * 4 * 3 * 2 * 1 * fact(0) =
= 5 * 4 * 3 * 2 * 1 * 1 =
= 5 * 4 * 3 * 2 * 1 =

def fact(n): = 5 * 4 * 3 * 2 =
return 1 if n == 0 else n*fact(n-1) = 5 * 4 * 6 =
= 5 * 24 =
= 120
Informática - Grado en Física - UMU 7
Factorial
➢Comprobar validez de argumentos
Número negativo como argumento
No número entero

def fact(n):
assert type(n) == int, “fact requiere un argumento entero”
assert n>=0, “fact requiere un argumento no negativo”
return 1 if n == 0 else n*fact(n-1)

Informática - Grado en Física - UMU 8


Factorial

Informática - Grado en Física - UMU 9


Fibonacci
➢Cada término es la suma de los dos anteriores
❑0, 1, 1, 2, 3, 5, 8, 13, 21, …

def fibo(n):
if n == 0:
return 0
if n == 1:
return 1
return fibo(n-1)+fibo(n-2)

fibo(9)
34

Informática - Grado en Física - UMU 10


Fibonacci
➢Cada término es la suma de los dos anteriores
❑0, 1, 1, 2, 3, 5, 8, 13, 21, …
%%time
def fibo(n): fibo(30)
global tot
if n == 0: Wall time: 809 ms
return 0 832040
if n == 1: Doble recursión ➔
return 1
tot +=2 Muy ineficiente
return fibo(n-1)+fibo(n-2)
Muchos cálculos repetidos
tot=0
fibo(30), tot (832040, 2692536)
Informática - Grado en Física - UMU 11
Fibonacci
➢Cada término es la suma de los dos anteriores

Informática - Grado en Física - UMU 12


Fibonacci
➢Cada término es la suma de los dos anteriores
❑Programar la función de forma iterativa
def fibo(n):
▪ Lista como variable acumuladora f = [0,1]
%%timeit for i in range(2,n+1):
21.4 µs ± 1.82 µs per loop (mean f.append(f[i-2]+f[i-1])
± std. dev. of 7 runs, 10000 return f[n]
loops each)
def fibo(n):
▪ 2 variables auxiliares if n == 0:
return 0
if n == 1:
return 1
%%timeit
n_2, n_1 = 0, 1
5.85 µs ± 251 ns per loop (mean for i in range(2, n+1):
± std. dev. of 7 runs, 100000 n_2, n_1 = n_1, n_1+n_2
loops each) return n_1
Informática - Grado en Física - UMU 13
Fibonacci
➢Cada término es la suma de los dos anteriores
❑Uso de ‘decorador’ para ‘memoization’
from functools import lru_cache

@lru_cache()
def fibo(n):
if n==0:
%%timeit
return 0 fibo(50)
if n==1: 75.9 ns ± 7.24 ns per loop (mean
return 1 ± std. dev. of 7 runs, 10000000
return fibo(n-1) + fibo(n-2) loops each)

Informática - Grado en Física - UMU 14


Bisección
kkjnavwezg
➢Búsqueda binaria hukkliusbm
rxmwcubogg
❑Encontrar utcmhqpjjc axohvbykak
utcmhqpjjc
aokuhgcdrc
xfrjkjrdbq
uedyrjdkzl
xxnqgxxkmv
mfpuqpvgtd
lyqobdcgxn
bqgpxoifyp
alkfunbaua
lwzvnukuaq
wuezbdkvji
uynrepmmdv
Informática - Grado en Física - UMU 15
Bisección
alkfunbaua
➢Búsqueda binaria aokuhgcdrc
axohvbykak
❑Encontrar utcmhqpjjc en conjunto ordenado bqgpxoifyp
hukkliusbm
kkjnavwezg
lwzvnukuaq
lyqobdcgxn
mfpuqpvgtd
rxmwcubogg
uedyrjdkzl
utcmhqpjjc
uynrepmmdv
wuezbdkvji
xfrjkjrdbq
xxnqgxxkmv
Informática - Grado en Física - UMU 16
Bisección
alkfunbaua
➢Búsqueda binaria aokuhgcdrc
axohvbykak
❑Encontrar utcmhqpjjc en conjunto ordenado bqgpxoifyp
hukkliusbm
kkjnavwezg
lwzvnukuaq
lyqobdcgxn
mfpuqpvgtd
rxmwcubogg
uedyrjdkzl
utcmhqpjjc
uynrepmmdv
wuezbdkvji
xfrjkjrdbq
xxnqgxxkmv
Informática - Grado en Física - UMU 17
Bisección
alkfunbaua
➢Búsqueda binaria aokuhgcdrc
axohvbykak
❑Encontrar utcmhqpjjc en conjunto ordenado bqgpxoifyp
hukkliusbm
kkjnavwezg
lwzvnukuaq
lyqobdcgxn
mfpuqpvgtd
rxmwcubogg
uedyrjdkzl
utcmhqpjjc
uynrepmmdv
wuezbdkvji
xfrjkjrdbq
xxnqgxxkmv
Informática - Grado en Física - UMU 18
Bisección
alkfunbaua
➢Búsqueda binaria aokuhgcdrc
axohvbykak
❑Encontrar utcmhqpjjc en conjunto ordenado bqgpxoifyp
hukkliusbm
kkjnavwezg
lwzvnukuaq
lyqobdcgxn
mfpuqpvgtd
rxmwcubogg
uedyrjdkzl
utcmhqpjjc
uynrepmmdv
wuezbdkvji
xfrjkjrdbq
xxnqgxxkmv
Informática - Grado en Física - UMU 19
Bisección
alkfunbaua
➢Búsqueda binaria aokuhgcdrc
axohvbykak
❑Encontrar utcmhqpjjc en conjunto ordenado bqgpxoifyp
hukkliusbm
kkjnavwezg
lwzvnukuaq
lyqobdcgxn
mfpuqpvgtd
rxmwcubogg
uedyrjdkzl
utcmhqpjjc
uynrepmmdv
wuezbdkvji
xfrjkjrdbq
xxnqgxxkmv
Informática - Grado en Física - UMU 20
Bisección
➢Esfuerzo computacional
❑Búsqueda secuencial en un conjunto desordenado de N elementos:

❑Búsqueda binaria en un conjunto ordenado de N elementos:

¿esfuerzo computacional para ordenar N elementos?


Informática - Grado en Física - UMU 21
Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

Informática - Grado en Física - UMU 22


Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

Informática - Grado en Física - UMU 23


Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

Informática - Grado en Física - UMU 24


Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

Informática - Grado en Física - UMU 25


Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

Informática - Grado en Física - UMU 26


Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

Informática - Grado en Física - UMU 27


Bisección

Informática - Grado en Física - UMU 28


Bisección
➢Método de la bisección
❑Resolver h(x) = 0 recursivamente
▪ Parte intervalo de búsqueda por la mitad y busca en trozo donde cambia de signo
▪ Termina cuando el intervalo es menor que la precisión deseada (eps)

def bisección(h,a,b,eps):
c = (a+b)/2
d = b-a
if d < eps:
return c
if h(a)*h(c)<0:
return bisección(h,a,c,eps)
else:
return bisección(h,c,b,eps)
Informática - Grado en Física - UMU 29
Bisección
➢Método de la bisección
❑Ejemplo: ecuación de Kepler

Informática - Grado en Física - UMU 30


Bisección
➢Método de la bisección
❑Ejemplo: ecuación de Kepler

def bisección(h,a,b,eps):
b = 0.3
c = (a+b)/2
a = 0.4
d = b-a
if d < eps:
def f(x):
return c
return x-b*np.sin(x)-a
if h(a)*h(c)<0:
return bisección(h,a,c,eps)
else:
bisección(f,0,np.pi/2,1E-8)
return bisección(h,c,b,eps)
0.5591362575837343
Informática - Grado en Física - UMU 31
Bisección
➢Método de la bisección def bisección(h,a,b,eps):
c = (a+b)/2
d = b-a
❑Ejemplo: if d < eps:
return c
if h(a)*h(c)<0:
return bisección(h,a,c,eps)
else:
return bisección(h,c,b,eps)

from math import cos

bisección(lambda x: cos(x)-x**2, 0, 3, 1E-8)

0.8241323148831725
Informática - Grado en Física - UMU 32
Árbol
➢Muchas estructuras naturales tienen una configuración repetitiva,
‘autosimilar’
➢Es posible recrearlas con programas recursivos
➢Recreación de estructura ramificada parecida a árbol:
❑Rama
▪ Caso base: hoja
▪ En otro caso, un tronco y dos ramas (calcular puntos de partida y llegada de
subramas)

Informática - Grado en Física - UMU 33


Árbol

Informática - Grado en Física - UMU 34


Árbol

Informática - Grado en Física - UMU 35


Árbol

Informática - Grado en Física - UMU 36


Árbol
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def rama(P,Q,n):
x1,y1 = P
x2,y2 = Q
if n>0:
dx,dy = D = Q-P
M = xm,ym = P + 0.3*D
plt.plot([x1,xm],[y1,ym],'black')
R = 0.4*np.array([dy,-dx])
rama(M,Q+R,n-1)
rama(M,Q-R,n-1)

plt.figure(figsize=(6,6))
rama(np.array([0,0]),[0,1],4)
plt.axis('equal');
Informática - Grado en Física - UMU 37
Árbol
def rama(P,Q,n):
x1,y1 = P
x2,y2 = Q
if n<=0:
plt.plot([x1,x2],[y1,y2],'green',lw=5,alpha=0.2)
else:
dx,dy = D = Q-P
M = xm,ym = P + 0.4*D
plt.plot([x1,xm],[y1,ym],'brown',lw=n)
R = 0.3*np.array([dy,-dx])
rama(M,Q+R,n-1)
rama(M,Q-R,n-1)

plt.figure(figsize=(6,6))
rama(np.array([0,0]),[0,1],8)
plt.axis('equal');
Informática - Grado en Física - UMU 38

También podría gustarte