【问题标题】:Binary to Decimal using recursion Haskell使用递归 Haskell 二进制到十进制
【发布时间】:2016-05-03 13:55:12
【问题描述】:

我有一个任务是在 Haskell 中创建一个将二进制转换为十进制的函数。它必须是一个仅使用 if-then-else、+、times 等的递归函数。我无法导入库来简化工作。到目前为止,我迷路了任何形式的指导都会有所帮助我不熟悉 haskell 我可以用另一种语言完成这项任务。

【问题讨论】:

  • 好的 - 你能用文字描述算法吗?也许我们可以从那里开始为您提供帮助
  • "我可以用另一种语言完成这项作业。"如果您可以用另一种语言进行递归且没有变异,那么您很有可能几乎可以将其逐字翻译成 Haskell。
  • 假设二进制存储为布尔值列表,您的函数有两种情况:(a) 列表为空,您可以返回 0。(b) 列表不为空。然后你有一个头值和列表的其余部分。对于列表的其余部分,只需调用相同的函数。所以现在给定头部值(真/假)和尾部值(一个数字),您可以计算头部:尾部的值。这是故意遗漏一些信息,因为我不想为你做任务。

标签: haskell recursion binary decimal


【解决方案1】:

如果你可以用另一种语言来做,那么我怀疑你会通过在迭代位时通过向十进制值添加值来构建十进制值来实现这一点。说2 + 8 + 128 代表10001010

在 Haskell 中,您可以使用带有两个参数的函数来实现这一点,如下所示:

binary2Decimal decimal [] = decimal
binary2Decimal decimal (bit : binary) = ...

发生的情况是,您最初将f 应用于decimal,即0,并且当您从位列表的头部(binary)中取出元素时,您添加了一个特定的十进制值(练习对于读者)到当前的十进制值。当binary[] 时,您已达到基本情况,decimal 将包含最终值。

如果您有兴趣,也可以使用fold(l/r) 解决此模式的问题,这样可以避免显式递归。

【讨论】:

  • 当然,首先定义 fold 然后使用它不是一个好主意 - IMO 对于初学者来说,直接使用递归定义函数更容易 - 稍后可以推广到 folds (有经验和很多涉及的模式)
  • 好点。我想我立刻认出了那里有一个折叠,并且无法摆脱它。我将编辑答案。
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2016-01-17
  • 2022-11-14
  • 2014-04-18
相关资源
最近更新 更多