我正在尝试在Haskell中创建一个代码,当k是偶数时,n ^ k =(n*n)^(k/2),如果k,则n ^ k = n*(n ^(k-1))很奇怪.我做错了什么,但我无法弄清楚如何解决它.
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) ???
Run Code Online (Sandbox Code Playgroud)
even并且odd是Haskell中的函数,您可以直接在保护条件中使用它们来测试数字是偶数/奇数.
以下是一个选项:
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) )
Run Code Online (Sandbox Code Playgroud)
http://zvon.org/other/haskell/Outputprelude/odd_f.html http://zvon.org/other/haskell/Outputprelude/even_f.html
编辑:
当然,您可以编写自己的偶数/奇数函数版本,并将它们作为替代.
例:
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) )
Run Code Online (Sandbox Code Playgroud)