• [^] # Re: Tail-call optimization de la factorielle ?

    Posté par (site web personnel) . En réponse à la dépêche Sortie du livre « Parallel and Concurrent Programming in Haskell ». Évalué à 6.

    Il y a un risque à cause des règles d'évaluation paresseuses du langage.
    Il faut parfois aider un peu en forçant l'évaluation (eg, via l'extention BangPatterns de GHC) l'évaluation. Sinon, tu crées des thunks en mémoire et risque au final le débordement de pile/tas, pas forcément à cause de l'adresse de retour, mais à cause des paramètres de l'appel récursif.
    Exemple:

    fac 100000 met quatre fois plus de tems que fac2 100000 sur mon PC:

    {-#LANGUAGE BangPatterns #-}
    fac n = fac' n 1
     where
     fac' 1 acc = acc
     fac' n acc = fac' (n-1) (n * acc)
    fac2 n = fac' n 1
     where
     fac' 1 !acc = acc
     fac' n !acc = fac' (n-1) (n * acc)
    

    Cela dit, c'est ptet plus un débordement de tas que de pile...