计算在求和和减法之间交替的序列

calculating a sequence that alternates between summation and subtraction

我正在尝试在 bash 中创建一棵分形树,前提是用户输入 N,其中 N 是分支数。

我需要编写以下将 N 作为输入的序列:

N = 1; sequence = 50
N = 2; sequence = (50-16),(50+16)
N = 3; sequence = (50-16-8),(50-16+8),(50+16-8),(50+16+8)
N = 4; sequence = (50-16-8-4),(50-16-8+4),(50-16+8-4),(50-16+8+4),(50+16-8-4),(50+16-8+4),(50+16+8-4),(50+16+8+4)
N = 5; sequence = (50-16-8-4-2),(50-16-8-4+2),(50-16-8+4-2),(50-16-8+4+2),(50-16-8+4-2),(50-16-8+4+2),(50-16+8-4-2),(50-16+8-4+2),(50-16+8+4-2),(50-16+8+4+2),(50+16-8-4-2),(50+16-8-4+2),(50+16-8+4-2),(50+16-8+4+2),(50+16+8-4-2),(50+16+8-4+2),(50+16+8+4-2),(50+16+8+4+2)

我正在尝试使用 for 循环和基础数学将此序列作为数组获取,但我仍然无法获得准确的输出,这是我目前的代码:

#!/bin/bash

N=
declare -a sequence=()

temp1=50
temp2=50
for i in $(eval echo "{1..$N}");do
        for j in $(eval echo "{1..$N}");do
                temp1=$((temp1+2**(5-j)))
                temp2=$((temp2-2**(5-j)))
        done
                sequence+=($temp1)
                sequence+=($temp2)
                temp1=50
                temp2=50
done

echo ${sequence[@]}

我不知道如何在求和和减法之间交替,我该如何处理?

好的,所以我不太确定你在做什么哈哈,但我写了一个脚本来生成你描述的输出..

N=

sequence=()
math_sequence=()

if [ $N -eq 1 ]
then
    math_sequence+=(50)
    sequence+=(50)
else
    for i in `seq 0 $(bc <<< "(2^(${N}-1)) - 1")`
    do
        X=50
        Y=32
        SIGNS=$(echo "obase=2;${i}" | bc | xargs printf "%0$((${N}-1))d\n" | sed 's/0/-/g; s/1/+/g')
        MATH="$X"
        VAL=$Y
        for (( i=0; i<${#SIGNS}; i++ )); do
            MATH+="${SIGNS:$i:1}"
            VAL=$(bc <<< "$VAL / 2")
            MATH+="${VAL}"
        done
        math_sequence+=( "(${MATH}), " )
        sequence+=( $(bc <<< "${MATH}") )
    done
fi
echo ${math_sequence[@]}
echo "----------------"
echo ${sequence[@]}

我在这里使用的一些技巧..

  1. 我看到 +/- 模式有点像二进制计数:----,---+,--+-,--++...+++-,++++ 所以我做了一个二进制计数器并使用 0's1's 作为 -+
  2. bc <<< "${EQUATION}"$(( ${EQUATION} ))靠谱多了。至少我更喜欢它。适用于更大的数字,使用 ^ 而不是 ** 作为指数。我的最爱
  3. 我为你生成了两个数组... math_sequence 包含方程列表,sequence 包含实际值。我不确定你到底想要哪一个,所以我把两个都给了你。
  4. 该脚本非常易于配置。只需更改 for loop 中的 XY,您就可以调整这个东西来生成各种数字。

bash thisScript.sh <N> 将生成您描述的输出:

N = 1; sequence = 50
N = 2; sequence = (50-16),(50+16)
N = 3; sequence = (50-16-8),(50-16+8),(50+16-8),(50+16+8)
N = 4; sequence = (50-16-8-4),(50-16-8+4),(50-16+8-4),(50-16+8+4),(50+16-8-4),(50+16-8+4),(50+16+8-4),(50+16+8+4)
N = 5; sequence = (50-16-8-4-2),(50-16-8-4+2),(50-16-8+4-2),(50-16-8+4+2),(50-16-8+4-2),(50-16-8+4+2),(50-16+8-4-2),(50-16+8-4+2),(50-16+8+4-2),(50-16+8+4+2),(50+16-8-4-2),(50+16-8-4+2),(50+16-8+4-2),(50+16-8+4+2),(50+16+8-4-2),(50+16+8-4+2),(50+16+8+4-2),(50+16+8+4+2)