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
Publicar un comentario