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真心不适合处理复杂运算,并且符号太多,很容易出错,调试就浪费了很多时间。

posted @ 2021-11-23 00:32  Leo'sblog  阅读(706)  评论(0编辑  收藏  举报