haskell - 实现函数 logBase2
问题描述
我想在 Haskell 中创建一个 logBase2 函数,它接受 2^x 的结果然后它返回 x 但我以某种方式失败了......我的代码是
logBase2 :: Integral a => a -> a
logBase2 1 = 0
logBase2 n = 1 + (div n 2)
但它会给我一些错误结果,比如如果我把logBase2 8
它给我 5 我怎样才能让那个东西完美地工作?
解决方案
您需要使用 进行递归调用div n 2
,因此:
logBase2 :: Integral a => a -> a
logBase2 1 = 0
logBase2 n = 1 + logBase2 (div n 2)
否则,该函数将为n返回1+(n/2)的值。
通过进行递归调用,我们将检索1 + 1 + 1 + 0
,因此:
Prelude> logBase2 8
3
推荐阅读
- python - Python pickler.load() 抛出 FileNotFoundError
- azure - 如何创建 AzureML 环境并添加所需的包
- swift - 如何在不使用类型名称的情况下引用静态 Swift 结构或类变量?
- kotlin - 如何在通过 id API 查找时,使用 Spring webFlux 发送 HTTP 状态为 200 的正文或 HTTP 状态为 204 的空正文?
- ios - Gitlab runner 在“完成请求崩溃报告。继续测试”之后等待了很多
- javascript - Javascript TypeError 代码出错,变量未定义
- reactjs - UseEffect 中的 SetState 导致无限循环
- android - 无法并排安装 NDK
- html - :hover 和 :active on touch 在移动设备上?
- mysql - MySQL Multiple CASE WHEN 在 WHERE 子句中不起作用