bash输出Y型二叉树
题目要求,输入的N要在1~5之间,输出Y型2叉树,当N=1时“Y”的高度是32,只有一层。当N=2时,有两层,第一层的Y的高度是32,第二层Y的高度是16,而且有两个“Y”。以此类推至5层。
#!/bin/bash
read N
rows=63
cols=100
declare -A arr
for ((i=0 ; i < rows ; i++))
do
for (( j=0 ; j<cols ; j++))
do
arr[$i,$j]='_'
done
done
function tree(){
#$1=y,$2=x,$3=height,$4=N
if (($4>=1 && $4<=5))
then
for ((i=0; i<$3 ;i++));do
arr[$(($1-i)),$2]='1'
arr[$(($1-$3-i)),$(($2-i-1))]='1'
arr[$(($1-$3-i)),$(($2+i+1))]='1'
done
tree $(($1-$3*2)) $(($2-$3)) $(($3/2)) $(($4-1))
tree $(($1-$3*2)) $(($2+$3)) $(($3/2)) $(($4-1))
fi
}
tree 62 49 16 $N
for ((i=0 ; i < rows ; i++))
do
for (( j=0 ; j<cols ; j++))
do
echo -n ${arr[$i,$j]}
done
echo
done
本来没想用递归,想逐一计算出输出位置,其实也是有规律的,不过超级麻烦。一会自己绕迷糊了。
- 在bash中二维数组的方括号里不能有空格。
- 取出数组中的数据要用属性扩展${},而不能用表达式扩展$(())
- echo ${#str},会输出str中字符的长度;echo ${str:1:3},会输出切片字符,切片索引从0开始,并且是闭区间(也就是包含当前字符)。