我试图在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) ???
发布于 2018-09-17 21:15:52
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) )
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) )
https://stackoverflow.com/questions/52367808
复制相似问题