最近一直在csdn论坛上看一些关于算法的问题,一直想不明白,很郁闷。
怀疑是自己思维不够敏捷吧,可是我看了一些算法的程序上面都是代码,
也没有注释,让我很郁闷。所以,就找来一个简单,但是我还是不懂的算法
拿来分析一下,希望和我一样郁闷的朋友借鉴,这个还没完工,希望大家和
我一块研究,谢谢
上面的分析可能的错误的,请大家说出来,我们一块探讨:
/**
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
* @author Administrator
*
*/
/**
* 进行对杨辉三角的分析
* int [][]a = new int[10][10*2-1];
* 总 共 10 行;
* 第 一 行 : (10*2/2)数字所在位置 ,个数 : 1
* 第 二 行 : (10 - 1)数字第一个的所在位置,第二个的所在位置是(10 + 1) ,个数 : 2
* 第 二 行 的 数字和为第一个数是 第一行的第(10-1)+10 , 第最后一个数 是 第一行的第 (10+1)+10;
*
* int x = 10; 行坐标
* int y = ; 纵坐标
* int [][]a = new int[x][x*2-1];
* 第一行: a[1][10] = 1;
* int[] arr = new int[10*2-1];
* for(int i = 0;i<10;i++){}
* 当 i = 0 时;
* int[] arr = new int[x*2-1];
* arr[x] = 1;
* a[i][x] = arr[x];
*
* 当 i = 1 时;
* int[] arr = new int[x*2-1];
* arr[x-i] = arr[i-1][x] + arr[i-1][x-1];
* arr[x+i] = arr[i-1][x] + arr[i-1][x+1];
*
* 当 i = 2 时;
* int[] arr = new int[x*2-1];
* arr[x-i] = arr[i-1][x] + arr[i-1][x-1];
* arr[x] = arr[i-1][x-1] + arr[i-1][x+1];
* arr[x+i] = arr[i-1][x] + arr[i-1][x+1];
*
* 当 i = 3 时;
* int[] arr = new int[x*2-1];
* arr[x-i] = arr[i-1][x-i] + arr[i-1][x-i+1];
* arr[x-i+1] = arr[i-1][x-i+1] + arr[i-1][x];
* arr[x+i-1] = arr[i-1][x] + arr[i-1][x+i-1];
* arr[x+i] = arr[i-1][x+i] + arr[i-1][x+i-1];
*
*
* 第二行:
* 第十个数字之前的数字 :a[2][10-1] = a[1][10] + a[1][10-1]
* 第十个数字之后的数字 :a[2][10+1] = a[1][10] + a[1][10+1]
* 第二行:
* 第十个数字之前的数字 :a[3][10-2] = a[2][10-1] + a[1][10-2]
* 第十个数字 :a[3][10] = a[2][10+1] + a[2][10-1]
* 第十个数字之后的数字 :a[3][10-2] = a[2][10+1] + a[1][10+2]
*/
这是看过csdn论坛上的一位大哥的程序明悟:
public class YangHuiSanJiao {
private int n;// 表示行
public YangHuiSanJiao(int n) {
this.n = n;
}
/**
* for循环输出
*/
public void printYangHuiSan(){
for (int i = 0; i < n ; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(calc(i, j) + "/t");
}
System.out.println();
}
}
/**
* 递归计算C(i,j) = 1 (k=0或者j=i);C(i,j) = C(i-1,j-1) + C(i-1,j)
* i:代表行,j:代表列
* 下一行的j列的值=上一行(j-1)列的值+j列的值
* calc(i,j) = calc(i-1,j-1)+calc(i-1,j);
* 并且判断j==0时说明它是第一列,第一列为一,还有最后一列,也为一。所以j==i是也让它等于1;
* @param i
* @param j
* @return
*/
public long calc(int i, int j) {
if (( j == 0 ) || (j == i)) return 1;
return calc(i-1,j-1)+calc(i-1,j);
}
public static void main(String[] args) {
YangHuiSanJiao y = new YangHuiSanJiao(5);
y.printYangHuiSan();
}
}