是否有更好的方法来检查n
和c
在这段代码中,也许与模式匹配或其他类似haskell的东西?
toBin :: Int -> Int -> [Int]
toBin n c
| n < 0 = []
| c <= 0 = []
toBin n c = toBin (n `div` 2) (c - 1) ++ [n `mod` 2]
它们都是布尔表达式,所以你可以将它们与||
toBin n c | n < 0 || c <= 0 = []
这里最好使用累加器,它可以防止在代码中使用O(n)追加导致O(n2)算法:
toBin :: Int -> Int -> [Int]
toBin = go[]
where gorsn c
| n < 0 || c <= 0 = rs
| otherwise = go(r:rs)q (c-1)
where (q,r) = quotRem n 2
因此,这里我们从一个空列表开始,每次在列表前加上下一个余数,直到数字为零,或者位数为0。