您的位置:首页 > 运维架构 > Shell

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

2012-12-14 12:16 549 查看
概述:

中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,

而杨辉三角的发现就是十分精彩的一页。

杨辉三角形,是二项式系数在三角形中的一种几何排列。

杨辉三角图:



650) this.width=650;" alt="" border="0" src="http://img1.51cto.com/attachment/201201/120620850.jpg" />
杨辉三角性质:

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脚本来实现:

本文内容来自《老男孩linux运维实战培训中心》shell编程部分内部学生练习资料,

在这里和大家一起分享,希望大家一起探讨,找到更多更好的方法。

实现脚本一(重点):



#!/bin/bash
export LANG="zh_CN.GB18030"
#本文内容来自《老男孩linux运维实战培训中心》shell编程部分内部学生练习资料
#欢迎广到运维兄弟一起交流linux/unix网站运维技术!
#网站运维交流群:114580181 45039636 37081784
#老男孩 QQ:31333741
#mail:31333741@qq.com
#blog:http://oldboy.blog.51cto.com

#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;i<=MAX;i++))
do
for ((j=$i;j>0;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

结论说明:

这个脚本难度一般,但是包含大量的shell基本语法,及相关解决问题技巧。值得每一个运维工程师,学习研究。 在写脚本时,老男孩也特意使用了多个shell语法结合的手法,希望同学们能掌握之。

网上的高手朋友,如果有更好的方法欢迎一起交流探讨!

实现脚本二:



#!/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
#2006.05.22    oldboy    QQ:31333741
#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

实现脚本4

#!/bin/bash
#
# Yang_Hui_Triangle

Yang_Hui_Triangle()
{
vector[0]=1
echo ${vector[0]}
for((row=1; row<=${1}; ++row))
do
vector[row]=1
for((col=row-1; col>0; --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}

脚本4为永夜兄弟提供!

执行结果:

[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

(over)
本文出自 “老男孩的linux博客” 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/756234
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: