关于杨辉三角的分析

最近一直在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();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值