Reputation: 133
I'm trying to create a code in Haskell that does n^k = (n * n)^(k/2) when k is even, and n^k = n * (n^(k−1)) if k is odd. I'm doing something wrong, but I can't figure out how to solve it.
power2 :: Integer -> Integer -> Integer
power2 n 0 = 1
power2 n k
| k < 0 = error "negative argument"
| k `mod` 2 == 0 = even -- Am I supposed to write = even here?
| otherwise = odd
if k even = (n 2) ( div k 2) -- (n^2)^(k/2) ???
if k odd = n * (n) (k-1)) -- Is this n^(k-1) ???
Upvotes: 2
Views: 227
Reputation: 2204
even
and odd
are functions in Haskell and you may use them directly inside guards conditions to test if a number is even/odd.
Below is one option:
power2 :: Integer -> Integer -> Integer
power2 n 0 = 1
power2 n k
| k < 0 = error "negative argument"
| even k = power2 (n * n) (div k 2)
| odd k = n * ( power2 n (k-1) )
http://zvon.org/other/haskell/Outputprelude/odd_f.html http://zvon.org/other/haskell/Outputprelude/even_f.html
EDIT:
Of course you may write your own version of even/odd functions and use them as an alternative.
Example:
myEven :: Integer -> Bool
myEven n = n `mod` 2 == 0
myOdd :: Integer -> Bool
myOdd n = n `mod` 2 == 1
power2 :: Integer -> Integer -> Integer
power2 n 0 = 1
power2 n k
| k < 0 = error "negative argument"
| myEven k = power2 (n * n) (div k 2)
| myOdd k = n * ( power2 n (k-1) )
Upvotes: 5