2010-04-30 11 views
9

¿Cómo puedo hacer que esta cola de la función de potencia Haskell sea recursiva?¿Cómo haces que esta cola de la función de potencia Haskell sea recursiva?

turboPower a 0 = 1 
turboPower a b 
    | even b = turboPower (a*a) (b `div` 2) 
    | otherwise = a * turboPower a (b-1) 
+0

No necesita '>' delante del código. Solo sangría por cuatro espacios. –

+0

Por cierto, probablemente deberías usar 'quot' en lugar de' div'. Además, tenga en cuenta que el '(^)' habitual también se basa en un algoritmo de exponenciación rápida. – dfeuer

Respuesta

10
turboPower a b = turboPower' 1 a b 
    where 
    turboPower' x a 0 = x 
    turboPower' x a b 
     | x `seq` a `seq` b `seq` False = undefined 
     | even b = turboPower' x (a*a) (b `div` 2) 
     | otherwise = turboPower' (x*a) a (b-1) 

Básicamente, lo que se quiere hacer es mover la multiplicación de que está haciendo en el "otherwise" el paso (ya que eso es lo que hace que esto sea recursiva de cola inicialmente) a otro parámetro.

Editado para agregar una línea que hace que los tres parámetros sean estrictamente evaluados, en lugar de perezosos, ya que esta es una de esas situaciones conocidas en las que la pereza puede perjudicarnos.

+0

Parece que querrá hacer que la versión recursiva de cola sea estricta en el argumento del acumulador. De lo contrario, su turboPower probablemente causará el agotamiento de la memoria cuando se exija el resultado del cálculo. –

+0

Buen punto, y también quiero hacerlo estricto en 'a' también. Hecho. –

Cuestiones relacionadas