Haskell 不同的公式取决于它是否';是奇数还是偶数
我正试图在Haskell中创建一个不需要n^k的代码 = (n) * n) ^(k/2)当k是偶数时,n^k = N * (n^(k)−1) )如果k是奇数。 我做错了什么,但我不知道怎么解决它Haskell 不同的公式取决于它是否';是奇数还是偶数,haskell,Haskell,我正试图在Haskell中创建一个不需要n^k的代码 = (n) * n) ^(k/2)当k是偶数时,n^k = N * (n^(k)−1) )如果k是奇数。 我做错了什么,但我不知道怎么解决它 power2 :: Integer -> Integer -> Integer power2 n 0 = 1 power2 n k | k < 0 = error "negative argument" | k `mod` 2 == 0 = even
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) ???
power2::Integer->Integer->Integer
power2 n 0=1
power2 n k
|k<0=错误“负参数”
|k`mod`2==0=偶数--我应该在这里写=偶数吗?
|否则=奇数
如果k偶数=(n2)(第k2部分)-(n2)^(k/2)???
如果k奇数=n*(n)(k-1))--这是n^(k-1)吗???
偶数
和奇数
是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) )
power2::Integer->Integer->Integer
power2 n 0=1
power2 n k
|k<0=错误“负参数”
|偶数k=power2(n*n)(第k2部分)
|奇数k=n*(幂2 n(k-1))
编辑:
当然,您可以编写自己版本的偶数/奇数函数,并将其用作替代
例如:
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) )
myEven::Integer->Bool
myEven n=n`mod`2==0
myOdd::Integer->Bool
myOdd n=n`mod`2==1
power2::整数->整数->整数
power2 n 0=1
power2 n k
|k<0=错误“负参数”
|myEven k=power2(n*n)(第K2部分)
|myOdd k=n*(幂2 n(k-1))
偶数
和奇数
是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) )
power2::Integer->Integer->Integer
power2 n 0=1
power2 n k
|k<0=错误“负参数”
|偶数k=power2(n*n)(第k2部分)
|奇数k=n*(幂2 n(k-1))
编辑:
当然,您可以编写自己版本的偶数/奇数函数,并将其用作替代
例如:
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) )
myEven::Integer->Bool
myEven n=n`mod`2==0
myOdd::Integer->Bool
myOdd n=n`mod`2==1
power2::整数->整数->整数
power2 n 0=1
power2 n k
|k<0=错误“负参数”
|myEven k=power2(n*n)(第K2部分)
|myOdd k=n*(幂2 n(k-1))
如果k偶数
和同样的如果k奇数
没有意义并且不会编译,我认为您需要其中偶数=…
。此外,GHCi将允许您在提供反馈的同时以交互方式处理错误。用它来测试你的评论。现在,我们有一个比Integer
更好的指数类型。导入<代码>数值。自然并使用power2::Integer->Natural->Integer
。那么你就不必担心指数是负数,因为它不可能是负数。Numeric.Natural
只是隐藏了运行时错误power2 3(-5)
仍然会进行打字检查。如果k偶数
和同样的如果k奇数
没有意义并且不会编译,我认为您需要其中偶数=…
。此外,GHCi将允许您在提供反馈的同时以交互方式处理错误。用它来测试你的评论。现在,我们有一个比Integer
更好的指数类型。导入<代码>数值。自然并使用power2::Integer->Natural->Integer
。那么你就不必担心指数是负数,因为它不可能是负数。Numeric.Natural
只是隐藏了运行时错误<代码>power2 3(-5)仍将进行打字检查。使用|……=True |否则=False
通常被认为是拙劣的风格。你已经有了真理的价值:用它吧!同样,您应该使用而不是来翻转它们,而不是使用防护装置。我已经按照惯例编辑了你的答案。@dfeuer:我是想让这个例子对新来者来说更具可读性和易懂性。在真实场景中,不需要替换标准的偶数和奇数函数。不管怎样,谢谢你的意见。使用|..=True |否则=False
通常被认为是拙劣的风格。你已经有了真理的价值:用它吧!同样,您应该使用而不是来翻转它们,而不是使用防护装置。我已经按照惯例编辑了你的答案。@dfeuer:我是想让这个例子对新来者来说更具可读性和易懂性。在真实场景中,不需要替换标准的偶数和奇数函数。无论如何,谢谢你的意见。