bash - 使用 BASH 计算给定空格分隔数字数组中所有可能的总和组合
问题描述
有没有办法使用纯 BASH 计算给定的空格分隔的“n”数字数组中所有可能的总和组合?
示例: 2 3 4....n
输出: 5 7 6 9 以此类推
解决方案
使用指标来告诉要对哪些元素求和。您可以将其实现为一个 1 和 0 的数组,其中 1 表示包含在 sum 中。要遍历所有组合,只需从与数字数组长度相同的数组开始,实现二进制递减很容易。如果指标只有一个 1,则跳过计算,因为您不希望仅包含数字。要仅报告每个总和一次,请使用关联数组来保存总和。
#!/bin/bash
sum () {
sum=0
for n in "$@" ; do
((sum += n ))
done
printf %d "$sum"
}
numbers=(2 3 4)
indicator=()
for _i in "${numbers[@]}" ; do
indicator+=(1)
done
declare -A sums
while si=$(sum "${indicator[@]}") ; (( si > 0 )) ; do
if (( si != 1 )) ; then
sum=0
for ((i=0; i<${#numbers[@]}; ++i)) ; do
(( indicator[i] && (sum+=numbers[i]) ))
done
sums[$sum]=1
fi
# Binary decrement.
i=0
until (( indicator[i] || i > ${#indicator[@]} )) ; do
indicator[i++]=1
done
indicator[i]=0
done
echo "${!sums[@]}"
推荐阅读
- javascript - 带有“很多”行的文件的承诺错误
- apache-kafka - 在发送请求之前,Kafka Producer 会一直等待 linger.ms 指定的值吗?
- google-sheets - 仅在匹配 2 个条件时删除重复条目
- node.js - 比较字符串数字时,Mongoose 查询不返回值
- sql - 可能来自工作台的功能?
- python - 在 python 中迭代列表时观察到奇怪的行为
- vue.js - Vue 路由器中未定义 NProgress
- javascript - 如何在 Joi 16 及更高版本中获取错误路径
- php - yii2、kartik fileinput、ajax上传场景:上传第二个文件、第三个文件等,错误替换之前文件的标签
- assembly - 汇编中的多位加法