我试图实现对数算法,但它似乎在循环中。
loga_b :: Int -> Int -> Int
loga_b a b
| b == 1 = 0
| b == a = 1
| otherwise = 1 + loga_b (b `div` a) b发布于 2014-10-09 13:13:00
在最后一种情况下,您切换了参数--尝试如下:
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)note --这将给出对负数的明智的行为--但我确信如果OP真的需要它,他可以自己考虑所有的情况;)
https://stackoverflow.com/questions/26277353
复制相似问题