如何在haskell中实现2 ^ x ++

时间:2015-03-15 00:27:13

标签: haskell functional-programming

我在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 ++:/请帮助:)

3 个答案:

答案 0 :(得分:2)

首先,您无法在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,并进行一些额外的乘法运算。你实际上可以不这样做。

答案 1 :(得分:1)

或者没有明确的递归,只需要使用列表函数

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++”。

答案 2 :(得分:0)

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

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