首页 > 解决方案 > 使用 BASH 计算给定空格分隔数字数组中所有可能的总和组合

问题描述

有没有办法使用纯 BASH 计算给定的空格分隔的“n”数字数组中所有可能的总和组合?

示例: 2 3 4....n

输出: 5 7 6 9 以此类推

标签: bashcombinations

解决方案


使用指标来告诉要对哪些元素求和。您可以将其实现为一个 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[@]}"

推荐阅读