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)
Fondamentalmente, ciò che si vuole fare è spostare la moltiplicazione che si sta facendo nel "otherwise
" passo (dato che questo è ciò che mantiene questo dall'essere ricorsiva in coda inizialmente) ad un altro parametro.
Modificato per aggiungere una linea che valuti rigorosamente tutti e tre i parametri, anziché i pigri, poiché questa è una di quelle situazioni note in cui la pigrizia può farci del male.
fonte
2010-04-30 01:26:31
Non è necessario '>' davanti al codice. Basta indentarlo di quattro spazi. –
A proposito, dovresti probabilmente usare "quot" invece di "div". Inoltre, si noti che il solito '(^)' si basa anche su un algoritmo di esponenziazione veloce. – dfeuer