shell编程-杨辉三角简单实现
shell编程-杨辉三角问题:
概述:
中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,
而杨辉三角的发现就是十分精彩的一页。
杨辉三角形,是二项式系数在三角形中的一种几何排列。
杨辉三角图:
杨辉三角性质:
1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。
2、第n行的数字个数为n个。
3、第n行数字和为2^(n-1)。(2的(n-1)次方)
4、每个数字等于上一行的左右两个数字之和。
5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数……这些数之和是第2n-1个斐波那契数。
6、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3…依此类推。
7.两个未知数和的n次方运算后的各项系数依次为杨辉三角的第(n+1)行。
思路:
因为使用过Java及C通过二维数组的方式可以轻松实现。
但是shell只有一维数组和关联数组,如何才能实现呢?-->通过下标区分元素。
如上图,把元素下标看成i,j
j=0 或者 i=j的时候,元素的值即为1
代码:
#!/bin/bash
MAX=0
#如何启动脚本时没指定最大行数就提示用户输入
#并判断是否为整数 expr
flag=true
read -p "Please input a number:" MAX
while $flag;do
expr $MAX+0 &> /dev/null
[ $? -eq 0 ] && flag=flase || read -p "Please input a interger:"MAX
done
declare -a num
for(( i=0;i<MAX;i++ ));do
#打印每行杨辉三角
for(( j=0;j<=i;j++ ));do
if [ $j -eq 0 -o $i -eq $j ];then
num[$i$j]=1
else
let ii=i-1
let jj=j-1
let num[$i$j]=${num[$ii$jj]}+${num[${ii}${j}]}
fi
done
#打印杨辉三角 关联数组
for(( j=0;j<=i;j++ ));do
echo -e "${num[$i$j]} \t\c"
done
echo
done
结果:
测试OK,暂时想到这种比较简单的实现方法,后续如果有好的方法再更新。
总结:
这个脚本难度一般,但是包含大量的shell基本语法,主要是回顾学习数组和嵌套循环的使用。
PS:不得不吐槽一句,shell真心不适合处理复杂运算,并且符号太多,很容易出错,调试就浪费了很多时间。