首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell对数函数的实现

Haskell对数函数的实现
EN

Stack Overflow用户
提问于 2014-10-09 11:33:20
回答 1查看 1.7K关注 0票数 2

我试图实现对数算法,但它似乎在循环中。

代码语言:javascript
复制
loga_b :: Int -> Int -> Int
loga_b a b
         | b == 1    = 0
         | b == a    = 1
         | otherwise = 1 + loga_b (b `div` a) b
EN

回答 1

Stack Overflow用户

发布于 2014-10-09 13:13:00

在最后一种情况下,您切换了参数--尝试如下:

代码语言:javascript
复制
loga_b :: Int -> Int -> Int
loga_b a b
  | b == 1    = 0
  | b == a    = 1
  | otherwise = 1 + loga_b a (b `div` a)

例子:

代码语言:javascript
复制
λ> loga_b 2 8
3
λ> loga_b 2 17
4

备注

你不需要第二个案子:

代码语言:javascript
复制
loga_b :: Int -> Int -> Int
loga_b a b
  | b == 1    = 0
  | otherwise = 1 + loga_b a (b `div` a)

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

代码语言:javascript
复制
1 + loga_b a (a `div` a) 
= 1 + loga_b a 1 
= 1 + 0
= 1

使其总数

正如Sassa所提到的,这是一个部分函数,我不知道您如何正确地修复这个函数,但我认为这应该可以:

代码语言:javascript
复制
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真的需要它,他可以自己考虑所有的情况;)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26277353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档