Ingresar:

Vladimir Costas :: Blog :: La elegancia y la Simplicidad de un caballero (o una dama, dependiendo del caso)

November 28, 2007

Nada mejor que la simplicidad... pero hacer las cosas con simplicidad requiere destreza!

Los fibonacci :

    fib :: Integer -> Integer
    fib 1 = 0
    fib 2 = 1
    fib n = fib (n-1) + fib (n-2)

    fibonacci2 :: [Integer]
    fibonacci2 = fibs 1
               where fibs i = fib i : fibs (i+1)

 El código arriba mostrado no es elegante y parece ser simple... sin embargo hay una forma más elegante y simple de mostrar los fibonacci:

fibonacci :: [Integer]

fibonacci =  0 : 1 : zipWith (+) fibonacci (tail fibonacci)

Obviamente es más simple y elegante, pero lo más probable es que simples mortales pueden verlo difícil de comprender... las claves son la lista perezosa y la recursión.

Hay que recordar que, como programadores, tenemos dos alternativas de acuerdo a la cita de Tony Hoare:

 "There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult."

Palabras clave: functional programming, haskell, hoare, lazy list, simplicidad, simplicity

Enviado por Vladimir Costas



Comentarios

  1. para todos aquellos qué no sabén las características y ventajas especiales de la programación funcional se los resumo en las siguientes lines.

    Los programas funcionales no contienen sentencias de asignación; de este modo las variables, una vez que adquieren cierto valor, nunca lo cambian. Más generalmente, los programas funcionales no contienen efectos colaterales. Una función que sea llamada puede no tener efecto sobre otra que calcule su resultado. Esto elimina una fuente importante de errores, y también hace al orden de la evaluación irrelevante – pues al no haber efectos colaterales que puedan modificar el valor de una expresión, esta puede ser evaluada en cualquier momento-. Esto libera al programador de la carga de
    establecer el control de flujo. Dado que las expresiones pueden ser evaluadas en cualquier momento, uno puede reemplazar libremente a las variables por sus valores y viceversa, los programas son “transparentes referencialmente”. Esta libertad ayuda a hacer a los programas funcionales matemáticamente manejables, contrario a su contraparte convencional.
     

    user iconAntonio Mamani on Wednesday, 28 November 2007, 11:18 BOT # |

  2. Desventajas de la programación funcional?

    user iconRho on Wednesday, 28 November 2007, 11:47 BOT # |

  3. No hay desventajas ... Hay algunas imperfecciones, hay que aceptarlo. La función fib, aparte de ser la más directa es también la más costosa. Veamos la ejecución:
    *Prueba> fib 10
    34 (0.00 secs, 0 bytes)
    *Prueba> fib 20
    4181 (0.03 secs, 809552 bytes)
    *Prueba> fib 30
    514229 (2.79 secs, 117398776 bytes)
    *Prueba> fib 40
    ^CInterrupted.
    
    Me aburrí de esperar el resultado. El algoritmo es exponencial. La segunda solución, además de su belleza es eficiente:
    *Prueba> fibonacci 20
    4181 (0.00 secs, 0 bytes)
    *Prueba> fibonacci 30
    514229 (0.00 secs, 0 bytes)
    *Prueba> fibonacci 40
    832040 (0.00 secs, 0 bytes)
    *Prueba> fibonacci 100
    354224848179261915075 (0.00 secs, 0 bytes)
    *Prueba> fibonacci 500
     139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125 
    (0.00 secs, 0 bytes)
    *Prueba> fibonacci 1000
     43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 
    (0.00 secs, 0 bytes)
    
    ¿No es impresionante? ¿Desventajas?

    user iconPablo Azero on Wednesday, 28 November 2007, 23:16 BOT # |

  4. wow

    user iconfelipe on Thursday, 29 November 2007, 10:48 BOT # |

Debes iniciar sesión para enviar un comentario.