杨辉三角形算法(java实现)

来源:互联网 发布:gas mask for mac 编辑:程序博客网 时间:2024/05/14 07:53

杨辉三角形实现:
一、杨辉三角形特点:


1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 

....

如上,就是一个6行的杨辉三角形。

特点如下:

1.每一行的第一个元素和最后一个元素都是1

2.第n行的元素是n个

3.每一行除首尾元素外,任一元素满足:[i][j]=[i-1][j-1]+[i-1][j](i代表行,j代表列)

二、知名老师的实现方式

最近在网上看到一名知名培训老师实现杨辉算法的方式,想来帮他分析一下微笑。他的实现代码如下:

public class TestYangHui {public static void main(String[] args) {int[][] yangHui = new int[10][];//1.初始化二维数组for(int i = 0;i < yangHui.length;i++){yangHui[i] = new int[i + 1];}//2.显式的为二维数组的每个元素赋值for(int i = 0;i < yangHui.length;i++){for(int j = 0;j < yangHui[i].length;j++){yangHui[i][0] = yangHui[i][i] = 1;//①if(i > 1 && j > 0 && j < i){     //②yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];}}}//遍历二维数组for(int i = 0;i < yangHui.length;i++){for(int j = 0;j < yangHui[i].length;j++){System.out.print(yangHui[i][j] + "\t");}System.out.println();}}}

看着是不是头都大了??不急,我们慢慢来分析下。

总体看,这个老师用了三组for循环。第一组for循环是用于初始化二维数组,第二组for循环用于填充二维数组,第三组for循环用于遍历输出二维数组。用了这么多for循环,可想而知这个简单算法的执行效率有多么慢。

再来看标红的地方。①处的目的是想把杨辉三角形每一行的首尾元素都填充1,②处的目的是将剩余的元素按[i][j]=[i-1][j-1]+[i-1][j]规律填充。这样写虽然可以实现功能,但是明显增加了算法的复杂程度。

三、杨辉算法的简易实现

下面是我的代码:

public class Test {//演示杨辉三角算法public static void main(String[] args) {yanghui(10);}/** *  * @param line:指定杨辉三角形的行数 */public static void yanghui(int line) {int[][] m=new int[line][];//声明二维数组for(int i=0;i<m.length;i++) {m[i]=new int[i+1];//对二维数组初始化for(int j=0;j<=i;j++) {int end=m[i].length-1;//最后一个元素if(j==0||j==end) {m[i][j]=1;}else {m[i][j]=m[i-1][j-1]+m[i-1][j];//核心算法}System.out.print(m[i][j]+" ");}System.out.println();}}}

我这个代码用一组for循环就可以实现二维数组的初始化、赋值、输出。而且实现算法是适用于每一行的,即不管是哪一行,只要遇到开头元素和结尾元素都是1,剩下的就按另一个规律处理。此外,通过传参的方式声明二维数组,增加了该算法的灵活性。

如有不妥的地方,欢迎指正哦






阅读全文
1 0