haskell - 实现 Haskell 对数函数

标签 haskell

我尝试实现对数算法,但它似乎处于循环中

loga_b :: Int -> Int -> Int
loga_b a b
         | b == 1    = 0
         | b == a    = 1
         | otherwise = 1 + loga_b (b `div` a) b

最佳答案

您在上一种情况下切换了参数 - 试试这个:

loga_b :: Int -> Int -> Int
loga_b a b
  | b == 1    = 0
  | b == a    = 1
  | otherwise = 1 + loga_b a (b `div` a)

示例:

λ> loga_b 2 8
3
λ> loga_b 2 17
4

备注

你真的不需要第二种情况:

loga_b :: Int -> Int -> Int
loga_b a b
  | b == 1    = 0
  | otherwise = 1 + loga_b a (b `div` a)

如果b == a,那么最后一种情况将计算为相同的1:

1 + loga_b a (a `div` a) 
= 1 + loga_b a 1 
= 1 + 0
= 1

总计

正如 Sassa 提到的,这是一个部分功能,我不确定您希望如何正确修复它,但我认为这应该没问题:

loga_b :: Int -> Int -> Int
loga_b a b
  | b < 0 || a < 0 = signum a * signum b * loga_b (abs a) (abs b)
  | b < a     = 0
  | b >= a     = 1 + loga_b a (b `div` a)

注意这将注意对负数给出合理行为我知道 - 但我确信如果OP真的需要它他可以自己思考所有的情况;)

关于haskell - 实现 Haskell 对数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26277353/

相关文章:

c - 在 Haskell(或 C)中解析模糊日期

haskell 导入和导出

Haskell Guards 和 Sublime Text 3

haskell - 为什么我的函数不适用于无限列表?

haskell - 为什么 Haskell 中没有很多关于协变和逆变的讨论(相对于 Scala 或 C#)?

haskell - 应用运算符 <* 和 *>,类型签名暗示

haskell - Haskell 中的依赖注入(inject) : solving the task idiomatically

haskell - 在 haskell 中使用 cheapskate 无法识别类型别名

haskell - 安全使用来自 GADT 存在的 unsafeCoerce?

haskell - Profunctor 的自由单子(monad)的模拟