多路递归之杨辉三角
基础版+记忆法优化计算重复项
package datastructure.linkedList.muti;
import org.junit.Test;
/**
* @ClassName YHSJDemo
* @Description 杨辉三角
* @Author macro
* @Date 2023/8/29 9:43
* @Version 1.0
*/
public class YHSJDemo {
/**
* 1
* 1 1
* 1 2 1
* 1 3 3 1
* 1 4 6 4 1
* 杨辉三角特点:
* 两侧都是1;非两侧的值=为头顶+头顶左侧
* 最上面为第一行,
* <p>
* 未优化的问题:在计算杨辉三角的第n行第k个数时,会重复计算第n-1行第k-1和第k个数。
*/
/*=========================================1.杨辉三角-直接递归(未优化)=========================================*/
@Test
public void test() {
print(5);
}
/**
* @param n:行数
* @author macro
* @description 打印行数为n的杨辉三角
*/
public void print(int n) {
//第一层遍历:遍历行
for (int i = 0; i < n; i++) {
//第二层遍历:遍历行上的所有列
for (int j = 0; j <= i; j++) {
/*调用递归方法,计算出所有的值并打印*/
System.out.printf("%-4d", recursion(i, j));
}
//上面第二层循环遍历了i行的所有列,换行打印
System.out.println("\n");
}
}
/**
* @param i:第几行
* @param j:第几行的第几列
* @return {@link int}
* @author macro
* @description 递归方法
*/
public int recursion(int i, int j) {
/*如果是两侧的,直接返回1*/
if (j == 0 || i == j) {
return 1;
}
//递归
return recursion(i - 1, j) + recursion(i - 1, j - 1);
}
/*=========================================2.优化版1(二维数组记忆法)=========================================*/
@Test
public void test1() {
print1(5);
}
/**
* @param n:行数
* @author macro
* @description 打印行数为n的杨辉三角
*/
public void print1(int n) {
//TODO 改动1:声明一个二维数组存储计算过的结果,并初始化长度
int[][] cache = new int[n][];
//第一层遍历:遍历行
for (int i = 0; i < n; i++) {
//TODO 改动2:在杨辉三角中,第几行就有几个列,且i从0开始,视为第一行,所以该行有i+1个列
cache[i] = new int[i + 1];
/*第二层遍历:遍历行上的所有列*/
for (int j = 0; j <= i; j++) {
/*调用递归方法,计算出所有的值并打印*/
System.out.printf("%-4d", recursion1(cache, i, j));
}
//上面第二层循环遍历了i行的所有列,换行打印
System.out.println("\n");
}
}
/**
* @param i:第几行
* @param j:第几行的第几列
* @return {@link int}
* @author macro
* @description 递归方法
*/
//TODO 改动3
public int recursion1(int[][] cache, int i, int j) {
/*1.大于0说明,存储过,不用再计算了,直接返回就行(int默认值为0,杨辉三角中最小值为1)*/
if (cache[i][j] > 0) {
return cache[i][j];
}
/*2.如果是两侧的,直接返回1*/
if (j == 0 || i == j) {
//计算过的加入二维数组中
cache[i][j] = 1;
return 1;
}
/*3走到这里说明这是杨辉三角中中间得且前面未计算过的.*/
//递归自己,计算出[i,j]的值
int res = recursion(i - 1, j) + recursion(i - 1, j - 1);
//将[i,j]的值放入二维数组中
cache[i][j] = res;
return res;
}
}