Primeras nociones de funciones

 Hemos explicado en clase algunas nociones de funciones.


Ésta es la versión ingenua de la función de Fibonacci, función típica

en la enseñanza de la programación por su naturaleza doblemente 

recursiva. En este caso, se le deja a Haskel la discriminación por casos,

por un algoritmo interno llamado "pattern matching" o casamiento de patrones.

Notemos cómo cada seudo-ecuación tiene un caso que excluye a los demás. 

Además, es digno notar que la parte de la barrita vertical es para ampliar las

posibilidades de discriminación, con un técnica de filtrado:


fib 0 = 1

fib 1 = 1

fib n | n>0 = fib(n-1)+fib(n-2)


En este caso, tenemos una definición más directa que la anterior, aceptada

en otros lenguajes funcionales previos, tales como Scheme (ver los sitios www.scheme.org, www.scheme.com y https://racket-lang.org/, para quienes tengan curiosidad):

nfib n = if n==0 || n==1 then 1 else nfib(n-1) + nfib(n-2)


Otra versión, ésta vez eficiente, y apoyada en una noción de lista infinita, sería la siguiente:


Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!1
1
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!2
2
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!3
3
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!4
5
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!5
8
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!6
13
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!7
21
Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!8
34



Comentarios

Entradas populares de este blog

La entrada y salida en Haskell

OpenGL en Haskell (material opcional)

¡Pi en Haskell!