计算在求和和减法之间交替的序列
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[@]}
我在这里使用的一些技巧..
- 我看到
+/-
模式有点像二进制计数:----,---+,--+-,--++...+++-,++++
所以我做了一个二进制计数器并使用 0's
和 1's
作为 -
和 +
。
bc <<< "${EQUATION}"
比$(( ${EQUATION} ))
靠谱多了。至少我更喜欢它。适用于更大的数字,使用 ^
而不是 **
作为指数。我的最爱
- 我为你生成了两个数组...
math_sequence
包含方程列表,sequence
包含实际值。我不确定你到底想要哪一个,所以我把两个都给了你。
- 该脚本非常易于配置。只需更改
for loop
中的 X
和 Y
,您就可以调整这个东西来生成各种数字。
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)
我正在尝试在 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[@]}
我在这里使用的一些技巧..
- 我看到
+/-
模式有点像二进制计数:----,---+,--+-,--++...+++-,++++
所以我做了一个二进制计数器并使用0's
和1's
作为-
和+
。 bc <<< "${EQUATION}"
比$(( ${EQUATION} ))
靠谱多了。至少我更喜欢它。适用于更大的数字,使用^
而不是**
作为指数。我的最爱- 我为你生成了两个数组...
math_sequence
包含方程列表,sequence
包含实际值。我不确定你到底想要哪一个,所以我把两个都给了你。 - 该脚本非常易于配置。只需更改
for loop
中的X
和Y
,您就可以调整这个东西来生成各种数字。
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)