我尝试实现对数算法,但它似乎处于循环中
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/