gpt4 book ai didi

Haskell 十进制转二进制

转载 作者:行者123 更新时间:2023-12-04 22:02:49 25 4
gpt4 key购买 nike

我正在尝试构建一个将 Decimal(Int) 转换为二进制数的函数。
不幸的是,除了在 java 中之外,不可能在 haskell 中将 int 除以 2。
我对函数式编程很陌生,所以问题可能是微不足道的。
到目前为止,我找不到这个问题的另一种解决方案,但是
这是我的第一次尝试:

 fromDecimal :: Int -> [Int]

fromDecimal 0 = [0]
fromDecimal n = if (mod n 2 == 0) then
do

0:fromDecimal(n/2)

else
do
1:fromDecimal(n/2)

我在这里得到了一个我之前做过的 java 实现:
   public void fromDecimal(int decimal){
for (int i=0;i<values.length;i++){

if(decimal % 2 = 0)
values[i]=true ;
decimal = decimal/ 2;
else {values[i]= false;
} }
}

希望这将有助于找到解决方案!

最佳答案

您的解决方案存在一些问题。首先,我建议根本不要使用 do,直到您了解 do 的作用。这里我们根本不需要 do

Unfortunately other than in java it is not possible to divide an int by two in haskell.



它实际上是,但是 / 运算符(实际上是 (/) 函数)的类型为 (/) :: Fractional a => a -> a -> a Int 不是 Fractional 。您可以使用 div :: Integral a => a -> a -> a 执行整数除法。

因此,代码如下所示:
fromDecimal :: Int -> [Int]
fromDecimal 0 = [0]
fromDecimal n = if (mod n 2 == 0) then 0:fromDecimal (div n 2) else 1:fromDecimal (div n 2)

但我们绝对可以让这更优雅。 mod n 2 只能产生两种结果: 01 ,而这些正是我们在 (:) 运算符左侧使用的结果。

所以我们根本不需要使用 if - then - else:
fromDecimal :: Int -> [Int]
fromDecimal 0 = [0]
fromDecimal n = mod n 2 : fromDecimal (div n 2)

可能这仍然不是您想要的:在这里我们编写二进制值,使得最后一个元素是最重要的元素。此函数将添加一个尾随零,这不会产生语义差异(由于该顺序),但它也不优雅。

我们可以定义一个函数 go 来省略这个零,如果给定的值不为零,比如:
fromDecimal :: Int -> [Int]
fromDecimal 0 = [0]
fromDecimal n = go n
where go 0 = []
go k = mod k 2 : go (div k 2)

然而,如果我们想首先写入最高有效位(因此与我们写入十进制数的顺序相同),那么我们必须反转结果。我们可以通过使用累加器来做到这一点:
fromDecimal :: Int -> [Int]
fromDecimal 0 = [0]
fromDecimal n = go n []
where go 0 r = r
go k rs = go (div k 2) (mod k 2:rs)

关于Haskell 十进制转二进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com