所以我正在尝试做一些数论工作,我正在使用Mathematica,但认为Haskell更适合处理无限列表(因为AFAIK Mathematica没有懒惰的评估)。我想要做的是让Haskell在无限懒惰列表中存储1 / x的所有数字。到目前为止,我的搜索还没有找到一种方法将比率分成数字,返回数字列表而不是实际的浮点数。
答案 0 :(得分:6)
我们也可以将其实现为简单的流生成器:
divDigits :: Int -> Int -> [Int]
divDigits x y = x `div` y : divDigits (10 * (x `mod` y)) y
实际上存在使用惰性列表的这种“无限” - 精确数字表示的库,请参阅Haskell Wiki。
答案 1 :(得分:2)
非常感谢Sam Yonnou,他提供的链接具有正确的公式
使用的公式:
x / y的第n位是(10 ^(n-1)* x mod y)/ y = floor(10 *(10 ^(n-1)* x mod y)/ y)mod 10的第1位数
结尾代码如下所示:
nDigRat :: Int -> Int -> Int -> Int
nDigRat num denom n = floor (fromIntegral (10*(10^(n-1)*num `rem` denom)) /
fromIntegral denom)
`rem` 10
decExpansionRecipRat :: Int -> [Int]
decExpansionRecipRat n = map (nDigRat 1 n) [1..]