数据结构与算法(2)——各种方法实现杨辉三角

本文介绍了如何使用二维数组、一维数组和递归三种方法来实现杨辉三角,详细阐述了杨辉三角的定义及其在二项式展开中的应用,并提供了完整的Java代码示例。
摘要由CSDN通过智能技术生成

分别用二维数组、一维数组、递归等三种方法实现杨辉三角;
杨辉三角:首尾都为1,中间数值等于其肩上两个数值之和,形如下面:

                                      1     
                                   1     1     
                                1     2     1     
                             1     3     3     1 

意义:杨辉三角是二项式(a+b)^n展开式的系数表,比如n=2时
(a+b)^2 = a^2 + 2ab + b^2
系数对应为 1 2 1,正好是杨辉三角的第三行

如下是完整的Java代码:

package algorithm;

public class YangHui {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        YangHui yh = new YangHui();
        yh.pattern(4);//模型化输出
        yh.dyadic(17);//二维数组实现
        yh.linear(14);//一维数组实现
        yh.recurrencePrint(14);//递归实现
    }

    // 模型化输出
    public void pattern(int n) {
        for (int i = 1; i <= n; i++) {// i控制行
            for (int k = 1; k <= n - i; k++) {// k控制列空格
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {// j控制列*
                System.out.print("*");
            }
            System.out.println();// 换行
        }
    }

    // 二维数组实现
    public void dyadic(int n) {
        int[][] a = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int k = 1; k < n - i; k++) {
                System.out.printf("%3s", " ");// 控制左边空格,以输出字符串的一半字符量为单位
            }
            for (int j = 0; j <= i; j++) {
                if (j == 0 || j == i) {
                    a[i][j] = 1;// 首尾都是1
                } else {
                    a[i][j] = a[i - 1][j - 1] + a[i - 1][j];// 中间值等于其肩上两个值之和
                }
                System.out.printf("%-6s", a[i][j]);// 左对齐,每个输出字符占6个字节,可保证5位数之内保持齐整
            }
            System.out.println();
        }
    }

    // 一维数组实现
    public void linear(int n) {
        int[] a = new int[n];
        // 用变量i来控制行,用一维数组a[i]来记录每一行的数值
        for (int i = 0; i < n; i++) {
            a[i] = 1;// 由于i一直在++,因此a[0]=1将永远都不会变了,同时a[i],即每一行的最后一个数值也将永远为1
            for (int k = 1; k < n - i; k++) {
                System.out.printf("%3s", " ");// 输出左边空格
            }
            for (int j = i - 1; j > 0; j--) {
                /*
                 * 由于杨辉三角成金字塔形,后一行比前一行多出首尾两个数字,而当变量i每次变化的时候,
                 * 第一个数字永远定格为1,不会再更新,但是每一行的最后一个值每次都会随着i的变化被赋值为1,
                 * 虽然i已经+1了,但是a[i]中首尾之间的数值依然没有变化,还是上一行的值,这就是本算法的核心点;
                 * 等号右边的a[j-1]和a[j]是上一行,即i-1时的值,等号左边的a[j]才是当前i的值;
                 */
                a[j] = a[j - 1] + a[j];
            }
            for (int j = 0; j <= i; j++) {
                System.out.printf("%-6s", a[j]);// 倒着计算,顺着输出,左对齐
            }
            System.out.println();
        }
    }

    // 递归实现
    public int recurrence(int i, int j) {
        if (i == j || j == 0) {
            return 1;// j=0代表每行的第一列,i==j代表每行的最后一列
        } else {
            return recurrence(i - 1, j - 1) + recurrence(i - 1, j);// 从源头寻找递归加和
        }
    }

    // 递归打印
    public void recurrencePrint(int n) {
        for (int i = 0; i < n; i++) {
            for (int k = 1; k < n - i; k++) {
                System.out.printf("%3s", "");
            }
            for (int j = 0; j <= i; j++) {
                System.out.printf("%-6s", recurrence(i, j));
            }
            System.out.println();
        }
    }
}

期待你更高效的算法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值