杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合 [2]。
package com.tfq.arithmetic.recursion;
import org.springframework.util.StopWatch;
/**
* @author: fqtang
* @date: 2024/06/03/19:20
* @description: 杨辉三角
*/
public class E03PascalTriangle {
/**
* 直接递归(未优化)
*
* @param i -行坐标
* @param j -列坐标
* @return 该坐标元素值
*/
private static int element(int i, int j) {
if(j == 0 || i == j) {
return 1;
}
return element(i - 1, j - 1) + element(i - 1, j);
}
/**
* 使用二维数组记忆法递归(优化1)
* <p>
* Params triangle -二维数组
* i -行坐标
* j -列坐标
*
* @return 该坐标元素值
*/
private static int elementoByMemery(int[][] triangle, int i, int j) {
if(triangle[i][j] > 0) {
return triangle[i][j];
}
if(j == 0 || i == j) {
triangle[i][j] = 1;
return 1;
}
triangle[i][j] = elementoByMemery(triangle, i - 1, j - 1) + elementoByMemery(triangle, i - 1, j);
return triangle[i][j];
}
/**
* 使用一维数组记忆法递归(优化2) ,节省了存储空间,这种是动态规划的思想
* Params triangle -二维数组 i -行坐标 j -列坐标
*
* @param row
* @param i
*/
private static void createRow(int[] row, int i) {
if(i == 0) {
row[0] = 1;
return;
}
for(int j = i; j > 0; j--) {
row[j] = row[j] + row[j - 1];
}
}
public static void print2(int n) {
int[] triangle = new int[n];
for(int i = 0; i < n; i++) {//行
createRow(triangle, i);
//printSpace(n,i);
for(int j = 0; j <= i; j++) {
System.out.printf("%-4d", triangle[j]);
}
System.out.println();
}
}
public static void print1(int n) {
int[][] triangle = new int[n][];
for(int i = 0; i < n; i++) {//行
triangle[i] = new int[i + 1];
//printSpace(n,i);
for(int j = 0; j <= i; j++) {
System.out.printf("%-4d", elementoByMemery(triangle, i, j));
//System.out.printf("%-4d", element(i, j));
}
System.out.println();
}
}
private static void printSpace(int n, int j) {
int num = (n - 1 - j) * 2;
for(int i = 0; i < num; i++) {
System.out.print(" ");
}
}
public static void main(String[] args) {
StopWatch sw = new StopWatch();
sw.start();
print2(5);
sw.stop();
System.out.println(sw.prettyPrint());
}
}