Tobias Bernhardt
Tobias Bernhardt

Reputation: 133

Different formula depending on if it's odd or even

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

Answers (1)

st4hoo
st4hoo

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

Related Questions