用shell脚本实现杨辉三角的4个方法实例

    /    2018-09-26

中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。杨辉三角形,是二项式系数在三角形中的一种几何排列。

杨辉三角性质:

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)行。

下面老男孩来带大家使用某些开发人员认为最土的shell脚本来实现:

实现脚本一(重点):

#!/bin/bash  
export LANG="zh_CN.GB18030" 
#judge input  
if (test -z $1) ;then 
  read -p "Input Max Int Lines:" MAX 
else 
        MAX=$1  
fi  
 
#judge int   
[ -n "`echo $MAX|sed 's/[0-9]//g'`" ] && \  
echo "Oldboy say,the num your input must be int,thank you,bye!" && exit 1  
 
#require <10  
[ ! $MAX -lt 10 ] && \  
echo "Oldboy say,the num your input must be int(1-9),thank you,bye!" && exit 1  
 
#start  
a[0]=1                  
for((i=0;i0;j--))     
        do  
                ((a[$j]+=a[$j-1]))  
        done  
                for ((j=0;j<=$[MAX-$i];j++))  
                do  
                    if [ $MAX -le 6 ]  
                      then 
                         echo -en "\t" 
                    else 
                         echo -n "   " 
                    fi  
                done  
        for ((j=0;j<=$i;j++))  
        do  
                    if [ $MAX -le 6 ]  
                      then 
                         echo -en "\t\t"${a[$j]}  
                    else 
                         echo -n ${a[$j]}"      " 
                    fi  
        done  
echo  
done

执行结果:

[oldboy@A ~]$ bash oldboy_training.sh 4

                                                        1

                                                1               1

                                        1               2               1

                                1               3               3               1

                        1               4               6               4               1

[oldboy@A ~]$ bash oldboy_training.sh 10

                                 1      

                              1      1      

                           1      2      1      

                        1      3      3      1      

                     1      4      6      4      1      

                  1      5      10      10      5      1      

               1      6      15      20      15      6      1      

            1      7      21      35      35      21      7      1      

         1      8      28      56      70      56      28      8      1      

      1      9      36      84      126      126      84      36      9      1      

   1      10      45      120      210      252      210      120      45      10      1     

实现脚本二:

#!/bin/bash  
if (test -z $1) ;then 
 read -p "Input Max Lines:" MAX 
else 
        MAX=$1  
fi  
 
i=1  
while [ $i -le $MAX ]   #i行控制  
do  
     j=1  
     while [ $j -le $i ]        #j列控制  
     do  
        f=$[i-1]        #f=i-1 这是另一种计算写法。  
        g=$[j-1]        #g=j-1 这是另一种计算写法。  
        if [ $j -eq $i ] || [ $j -eq 1 ] ; then 
                declare SUM_${i}_$j=1           #声明变量 头尾都是1  
        else 
                declare A=$[SUM_${f}_$j]       #取上一行的j列变量  
                declare B=$[SUM_${f}_$g]       #取上一行的j-1列变量  
                declare SUM_${i}_$j=`expr $A + $B`    #声明并计算当前变量的值  
        fi  
        echo -en $[SUM_${i}_$j]" "  #输出当前变量  
        let j++  
     done  
     echo       #换行  
     let i++  
done

实现脚本三:

#!/bin/bash  
#History  
#i表示当前行  
#j表示当前位置  
#f/g表示上一行、上一位置  
 
if (test -z $1) ;then 
 read -p "Input Max Int Lines:" MAX 
else 
        MAX=$1  
fi  
for ((i=1;i<=MAX;i++))  
do  
    for ((j=1;j<=i;j++))  
    do  
      f=$(($i-1))  
      g=$(($j-1))  
          if [ "$j" == 1 ];then 
           declare SUM_${i}_$j=1  
          else 
           declare  A=$[SUM_${f}_$j]  
           declare  B=$[SUM_${f}_$g]  
           declare  SUM_${i}_$j=`expr $A + $B`  
          fi  
      echo -n $[SUM_${i}_$j]  
      echo -en "  " 
    done  
echo  "  " 
done

执行结果:

[root@oldboy scripts]# bash oldboy.sh   

Input Max Lines:10  

1      

1  1      

1  2  1      

1  3  3  1      

1  4  6  4  1      

1  5  10  10  5  1      

1  6  15  20  15  6  1      

1  7  21  35  35  21  7  1      

1  8  28  56  70  56  28  8  1      

1  9  36  84  126  126  84  36  9  1  

实现脚本四:

#!/bin/bash   
#   
# Yang_Hui_Triangle   
   
Yang_Hui_Triangle()   
{   
    vector[0]=1   
    echo ${vector[0]}   
    for((row=1; row0; --col))   
        do   
            ((vector[col]+=vector[col-1]))   
        done   
        for((col=0; col<=row; ++col))   
        do   
            echo -n "${vector[col]} "   
        done   
        echo   
    done   
}       
   
Yang_Hui_Triangle ${1}

执行结果:

[oldboy@A ~]$ bash yang.sh  10

1

1 1 

1 2 1 

1 3 3 1 

1 4 6 4 1 

1 5 10 10 5 1 

1 6 15 20 15 6 1 

1 7 21 35 35 21 7 1 

1 8 28 56 70 56 28 8 1 

1 9 36 84 126 126 84 36 9 1 

1 10 45 120 210 252 210 120 45 10 1 

(10)

分享至