【问题标题】:How implement 2^x++ in haskell如何在haskell中实现2^x++
【发布时间】:2015-03-15 23:15:08
【问题描述】:

嗨,我在 Haskell 中的编程函数,将二进制数转换为十进制数

我有函数余数

--return last bit
portion :: Integer -> Integer 
portion10 n = n `div` 10

remainder10 :: Integer -> Integer
remaindern10 n = n `mod` 10

现在我想使用递归的 binToDec

binToDec 0 = 0
binToDec binary = (remainder10 binary) * 2^x++ + binToDec (portion10 binary) 

我需要知道如何在我的 binToDec 函数中实现 2^x++ :/ 请帮助 :)

【问题讨论】:

  • 这是什么意思? 2^x++ 是什么?
  • 通过算法将二进制数转换为十进制数索引数从右... 2^0 2^1 2^2 ...*0 || *1

标签: haskell functional-programming


【解决方案1】:

首先,您不能在 Haskell 中更改变量。几乎所有东西都是不可变的。如果你想要一个计数器,最简单的方法是在函数中添加另一个参数:

binToDec binary = binToDec binary 0 where
  binToDec' 0 _ = 0
  binToDec' binary counter = (remainder10 binary) * 2^counter + binToDec' (portion10 binary) (counter+1)

然而,其次,在这种情况下,您实际上可以做得更好。请注意,计算2^n 需要多次平方 2,并进行一些额外的乘法运算。你实际上可以不用它。

【讨论】:

    【解决方案2】:

    或者没有显式递归,只玩列表函数

    import Data.List
    import Data.Tuple
    
    binToDec x = sum $ zipWith (*) (unfoldr remainder x)
                                   (iterate (*2) 1) where
        remainder 0 = Nothing
        remainder x = Just . swap  $ divMod x 10
    

    iterate (*2) 1 是您问题的答案,如何“实施2^x++”。

    【讨论】:

      【解决方案3】:

      或者你可以这样做,只是另一个版本:

      binToDec :: Int -> Int -> Int
      binToDec 0 _ = 0
      binToDec b c = mod b 10 * 2^c + binToDec (div b 10) (c + 1)
      

      【讨论】:

        猜你喜欢
        • 2014-06-12
        • 2013-12-17
        • 2020-11-04
        • 2012-07-09
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        相关资源
        最近更新 更多