前几天我在自学刘意老师的教学视频时,里面有讲述了一个关于利用二维数组建立杨辉三角的问题;这是一个很神奇的事情,当然啦!我在这里不会过多的论述在java编程里面用什么代码去打出杨辉三角,要了解这个的话看个视频也比看我的文章要好理解的多,对于我们编程者,特别是编程初学者而言,理解杨辉三角的数学内涵以及二维数组的基本要素,从中得出这两者的关联点与性质的结合,平心而论,这也还是蛮重要的!
我们不是数学家,是专业编程者不必深入的了解这东西的奥秘,但是,既然讲到杨辉三角,那我们首先要了解这是什么,什么是杨辉三角?什么是数组?多维数组又是什么?它的数学内涵是什么?它表达的是什么意思?在社会工作,当中这些有什么具体的应用?和java编译数组有和关联?等等之类的,这是一个简单又复杂的概念,我将尝试用我自己的理解去论述这些,下面,我将论述其一二。
所谓杨辉三角,其实就是二项式系数在三角形中的一种几何排列形式,其排列性质为,我们看过杨辉三角图,从中发现有不少显而易见的的东西,我们得出,在一个杨辉几何三角形行里,每个数等于它上方两个数字和,每行数字左右对称,由1开始逐渐变大,不管是横列还是纵列,它的第N行的数字就一定有N个项,就比如第一行的数字是1,总共就1行,另外第N行数字和为2的n-1次幂,假设,我们需要第4行第3列的值,可以假定我们要寻找第n行的第m个数字,假定为两个变量m和n,第n行的第m个数则可以表示为C(n-1,m-1),第4行第3列的值,在帕斯卡坐标轴里面则为X与Y,也就是横坐标与纵坐标,回到三角阵列当中,C(n-1,m-1)即为从n-1个不同的元素中获取m-1个元素的组合数值,简单而言套用上去,就是,在4行的3个元素可表示为C(3,2),从3个不同的元素中获取2个元素的组合数,由此,我们可以得出每个数字等于上一行的左右两个数字之和,这是整个杨辉三角的根本特性,人们还可以利用此性质手写出整个杨辉三角,其中第n+1行的第m个数等于第n行的第m-1个数和第m个数之和,这也是组合数的性质之一,即为C(n+1,m)= C(n,m)+C(n,m-1);回到上面,我们看第4行第3列,综上所述,我们得到一个组合数,那就是根据C(n+1,m)= C(n,m)+C(n,m-1)而得到的C(4+1,3)= C(4,3)+C(4,3-1),由此我们可以得到一个简单的式子就是(a+b)^n,它对应着杨辉三角的第(n+1)行当中的每一项,我们都学过(A+B)^2是等于多少的,而与杨辉三角联系最紧密的是二项式乘方展开式的系数规律,即为二项式定理,例如,杨辉三角的第3行的三个数恰好依次对应着两个数的和平方的展开式的每一项的系数,第四行的四个数恰好对应着两个数的和的m³的展开式的每一项系数,以下的以此类推。
相对于变成而言,杨辉三角在编程实现当中比较容易,最为常见的算法是用上一行递推运算;也可以用组合和数组的形式的对应关系而使用阶乘计算的,然而后者速度较慢且阶乘容易溢出,输出也非常相似,就比如C,C++,C#,java语言,它们之间的语法的相似性非常大,无非只是函数名称的改变或者某种定义的写法方式不同而已,实际上只需要注意一些简单的语法和函数名称的改变就行了。
默认求杨辉三角的直角三角形,可以通过注释的开关或者使用编译器-D定义开关调节等腰三角形和菱形的各个参数的输出,亦可按照define使用的情况剔除因不符合ifdef条件从而未启动的代码之后的阅读。
以上算法创建了一个多维数组,具体而言是一个二维数组,并通过当前数值求当前行。当再一次反过来再次打印时,这个程序会使用以前算好的值,从而节省了重复迭代的时间,而对于一段java代码的切入点而言,无非是确定三角形的长宽值,行数等等之类的参数,原理上,可以根据我在上文所论述的数理而得出答案,但是其最为基本的,就是左右两边全都是一,而从第二行开始起,中间的每一行数是上一行里面每一个相邻的两个数之和,其实质就是我们所知道的二项式定理(A+B)的N次幂,我们可以通过此方法进一步的了解二项式--杨辉三角的特性以及在突破在使用java编译杨辉三角代码时的瓶颈,以上是我对杨辉三角以及数组编译的一些关联的东西,若有疏漏之处,敬请原谅。 |