Funciones recursivas

Números de Fibonacci

Es la sucesión de números

f0=0, f1=1, f2=1, f3=2, f4=3, f5=5, f6=8, f7=13, f8=21...

Los dos primeros números son el 0 y el 1. El tercero f2, se obtiene sumando el primero y segundo. El cuarto f3, se obtiene sumando el segundo y tercero y así, sucesivamente.

fn=fn-1+fn-2, n=2,3,4,...

Podemos crear un función fibonacci recursiva del siguiente modo

function y=fibonacci(n)
    if n==0
        y=0;
    elseif n==1
        y=1
    else
        y=fibonacci(n-1)+fibonacci(n-2);
    end
end

Probamos la función fibonacci en la ventana de comandos para calcular el término 8 de la sucesión

>> fibonacci(8)
ans = 21

Creamos una versión que devuelve la serie de números de Fibonacci f0, f1, ...fn

function Y=fibonacci_1(n)
    Y=[0,ones(1,n)];
    for i=3:n+1
        Y(i)=Y(i-1)+Y(i-2);
    end
end
>> fibonacci_1(8)
ans =     0     1     1     2     3     5     8    13    21

Factorial de un número

Definiremos una nueva versión de la función que calcula el factorial de un número n, n!, que denominaremos, factorial_r.

n!=n·(n-1)·(n-2)...3·2·1

function res=factorial_r(n)
    if n==0
        res=1;
    else
        res=n*factorial_r(n-1);
    end
end

Probamos la función factorial_r en la ventana de comandos para calcular el factorial de 4, 4!, será

>> factorial_r(4)
ans = 24 

Polinomios de Hermite

Los primeros seis polinomios de Hermite son los siguientes.

H0(x)=1
H1(x)=2x
H2(x)=4x2-2
H3(x)=8x3-12x
H4(x)=16x4-48x2+12
H5(x)=32x5-160x3+120x

Todos los polinomios de Hermite de orden n>2 se pueden expresar en términos de los dos primeros polinomios H0(x) y H1(x), de orden cero y uno respectivamente, mediante la siguiente relación de recurrencia.

H n (x)=2x· H n1 (x)2(n1) H n2 (x)

El código de la función recursiva hermite que calcula los valores del polinomio Hn(x) es muy simple. A dicha función se le pasa el orden n del polinomio de Hermite y la abscisa x y devuelve el resultado del cálculo.

function res=hermite(n, x)
    if n==0
        res=1;
    elseif n==1
        res=2*x;
    else
        res=2*x*hermite(n-1,x)-2*(n-1)*hermite(n-2,x);
    end
end

Probamos la función hermite en la ventana de comandos para calcular H5(2)

>> hermite(5,2)
ans = -16

Triángulo de Pascal

El triángulo de Pascal es una disposición de números tales que cada fila corresponde a los coeficientes del binomio (a+b)m. Por ejemplo la fila 3 es (a+b)3=1a3+3a2b+3ab2+1b3

Como podemos apreciar la fila m, se puede obtener a partir de la fila m-1, observando que Rm(i)=Rm-1(i-1)+Rm-1(i), para i=2,....m. Con Rm(1)=1 y Rm(m+1)=1

function Y =pascal(m)
    if m==1
        Y=[1,1];
    else
        Y=pascal(m-1);
        A=zeros(1,m-1);
        for i=1:m-1
            A(i)=Y(i)+Y(i+1);
        end
        Y=[1,A,1];
    end
end
>> pascal(5)
ans =     1     5    10    10     5     1

El número π

Para calcular la longitud de una circunferencia, comenzamos con el perímetro de un cuadrado, después con un octógono, un polígono regular de 16 lados y así, sucesivamente

En la figura se muestra un polígono regular de ocho lados

n=2^3; %ocho lados
x0=cos(pi/n);
y0=sin(pi/n);
for i=1:n
    x1=cos(pi/n+2*i*pi/n);
    y1=sin(pi/n+2*i*pi/n);
    line([x0,x1],[y0,y1])
    x0=x1; y0=y1;
end
axis equal
grid on
ylim([-1.1,1.1])

Calculamos la longitud del lado an un polígono regular de n lados inscrito en la circunferencia de radio R, (en color rojo).

a n =2Rsin( π n )

Del mismo modo, obtenemos la longitud del lado de un polígono regular inscrito de 2n lados (en color azul)

a 2n =2Rsin( π 2n )

Teniendo en cuenta la relación trogonométrica

sin( α 2 )= 1cosα 2 = 1 1 sin 2 α 2

Establecemos la relación entre an y a2n y por tanto, entre el perímetro Pn del polígono regular de n lados y el perímetro P2n del polígono regular de 2n lados.

P 2n =2nR 2 4 P n 2 R 2 n 2

Tomando R=1, empezamos con el cuadrado

P 4 =4 2 P 8 =2·4 2 4 4 2 ( 2 ) 2 4 2 = 2 3 2 2 P 16 =2·8 2 4 8 2 ( 2 2 ) 2 8 2 = 2 4 2 2+ 2 P 32 =2·16 2 4 16 2 ( 2 2+ 2 ) 2 16 2 = 2 5 2 2+ 2+ 2 ....

Definimos la función auxiliar recursiva calculo_pi que calcula la parte

2+ 2+ 2+...

function z = calculo_pi(n)
    if n>0
        z=sqrt(2+calculo_pi(n-1));
    else
        z=0;
    end
end

En el script, calculamos el resto del perímetro dividido entre dos y lo comparamos con el número π

format long
for n=1:10
    z=2^n*sqrt(2-calculo_pi(n-1));
end
disp([z; pi])
3.141591421504635
3.141592653589793