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