Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Definiciones Recursivas
Índice de contenidos
I. Introducción
II. Factorial
III. Fibonacci
IV. Bisección
V. Árbol
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)
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)
def fibo(n):
if n == 0:
return 0
if n == 1:
return 1
return fibo(n-1)+fibo(n-2)
fibo(9)
34
@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)
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
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)
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)
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