haskell - 将数字列表转换为自然数
问题描述
给定一个表示自然数和基数 >2 的数字列表,如何输出正确的自然数。即给定 [1,2,3] 和以 10 为底,我们得到 123。给定 [1,0,1] 和以 2 为底,我们得到 5。
有一些例子涵盖了使用 div 和 mod 将数字转换为列表,但我不知道如何做相反的事情(对于二进制数,对于小数,它很容易将数字列表直接转换为 int,但我假设有一个在这两种情况下都有效的数学方法)。
--For decimal conversion:
fromDigits :: [Integer] -> Integer
fromDigits xs = aux xs 0
where aux [] acc = acc
aux (x:xs) acc = aux xs ((acc * 10) + x)
解决方案
以r为基数的位置数系以这样的方式构造,使得数字a 1 a 2 …a n与a i数字具有值:
这意味着我们可以通过以下方式获得一系列数字的数字:
fromDigits :: (Num a, Foldable f) => a -> f a -> a
fromDigits r = foldl (\a x -> r * a + x) 0
或者在语法上更紧凑:
fromDigits :: (Num a, Foldable f) => a -> f a -> a
fromDigits r = foldl ((+) . (r *)) 0
每次迭代,我们将累加器与基数相乘r
,然后将下一个数字加到它上面。最终,如果数字包含n位,则第一位数字将因此乘以基数r
n次。
例如,1425
对于不同的基数,该数字具有不同的值:
Prelude> fromDigits 6 [1,4,2,5]
377
Prelude> fromDigits 7 [1,4,2,5]
558
Prelude> fromDigits 8 [1,4,2,5]
789
Prelude> fromDigits 9 [1,4,2,5]
1076
Prelude> fromDigits 10 [1,4,2,5]
1425
推荐阅读
- ide - 每个项目的 WebStorm 中的实时模板(通过 .idea 文件夹)..?
- python - 为什么 Conv2D 的输入通道限制为 1,3,4,张量维度在 tensorflow 中限制为 4-D?
- r - 对于每个组,第一次出现元素 1 的时间是什么时候?
- reactjs - 在 useFirestoreConnect 挂钩中使用 new Date() 导致连续文档读取的查询
- slack-api - 其他空间的令牌
- android - 启用了 Firestore 的 Android:com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:缺少权限或权限不足
- python - 如何将列表拆分为另一个列表指定的不同尺寸的夹头?
- react-native - TypeError:未定义不是一个对象(评估'state.login.profile')
- spring - 使用 spring boot 运行单元测试,“没有可运行的方法”错误
- sql - 按另一个表中的列排序