【问题标题】:In haskell how can I make binary digits from a decimal number?在 haskell 中,如何从十进制数中生成二进制数字?
【发布时间】:2021-12-09 23:32:26
【问题描述】:

实现Bin函数,倒序返回一个非负整数的二进制数!

例子:

  • Bin 0 == []
  • Bin 1 == [1]
  • Bin 2 == [0,1]
  • Bin 10 == [0, 1, 0, 1]
Bin :: Integer -> [Int]
Bin 0 = []
Bin a `div` 2 = b
Bin a `mod` 2 = c

我想将我的除法结果返回给 Bin 函数并再次对其进行修改等等。 我该如何解决这个问题?我能得到一些帮助吗?

【问题讨论】:

  • 函数都是小写的,所以bin而不是Bin
  • 你希望Bin a `div` 2 = b 做什么?

标签: haskell binary decimal


【解决方案1】:

只有一个参数,所以bin的实现如下:

bin :: Integer -> [Int]
bin 0 = []
bin n = …

我们可以用divMod :: Integral a => a -> a -> (a, a)确定模数并将数字除以2,我们可以使用where子句设置变量dm

bin :: Integer -> [Int]
bin 0 = []
bin n = …
    where (d, m) = divMod n 2

我们不能直接使用m,因为这是Integer,而不是Int,我们可以使用fromIntegral :: (Integral a, Num b) => a -> bInteger转换为Int

因此,我们需要构造一个以m 作为该列表元素的列表,并使用递归来确定列表中的其他项目。因此, 部分应该构造这样的列表。我把它留作练习。提示:您可以使用x 作为第一项,将xs 作为剩余项目的列表,使用(x:xs)

【讨论】:

  • 像这样: Bin n = (x:m:xs) = x : Bin m xs ?我将 m 添加到列表中,我想归还 m 和剩余的列表。这是正确的还是我必须做点什么?
  • @hello16:(x:m:xs) 在这里做什么?
  • 它们只是列表中的项目。
  • @hello16: 那么(x : bin m xs)是什么?定义每个子句只能包含 一个 =
  • 哦,所以我只能用一个=。比 bin n = bin m xs 。我想用这个来回馈 m 和列表的其余部分。我需要归还 m 还是只需要归还 xs?
猜你喜欢
  • 2010-12-29
  • 2022-01-23
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
相关资源
最近更新 更多