• 算法 杨辉三角求解 java打印杨辉三角 多路递归打印杨辉三角 递归优化杨辉三角 记忆法优化递归 帕斯卡三角形 算法(十二)


    1. 杨辉三角

                        是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。 --百度百科

    2. 杨辉三角特点:

                                   1. 每个数等于它上方两数之和               

                                   2. 每行数字左右对称,由1开始逐渐变大

                                   3. 第n行的数字有n项

                                   4. 前n行共[(1+n)n]/2 个数

                                   5. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数

    3. 图像:

    4.公式:

               行 i,列 j ,那么 [i][j] 的取值应为 [i-1]*[j-1] + [i-1][j]

               当i=0 或 i=j 时, [i][j]值为1

    5. 多路递归第一版:

    1. package com.nami.algorithm.study.day09;
    2. /**
    3. * beyond u self and trust u self.
    4. *
    5. * @Author: lbc
    6. * @Date: 2023-09-20 14:32
    7. * @email: 594599620@qq.com
    8. * @Description: keep coding
    9. */
    10. public class PascalTriangle {
    11. public static int calculate(int i, int j) {
    12. if (i == j || j == 0) {
    13. return 1;
    14. }
    15. return calculate(i - 1, j - 1) + calculate(i - 1, j);
    16. }
    17. /**
    18. * 每行空白区域
    19. * @param n
    20. * @param i
    21. */
    22. private static void printSpace(int n, int i) {
    23. // 参数2 与下面打印的 %-4d 的数字有关系,是他的一半
    24. int num = (n - 1 - i) * 2;
    25. for (int j = 0; j < num; j++) {
    26. System.out.print(" ");
    27. }
    28. }
    29. public static void print(int row) {
    30. for (int i = 0; i < row; i++) {
    31. printSpace(row, i);
    32. for (int j = 0; j <= i; j++) {
    33. // System.out.print(calculate(i, j) + " ");
    34. System.out.printf("%-4d", calculate(i, j));
    35. }
    36. System.out.println();
    37. }
    38. }
    39. public static void main(String[] args) {
    40. long start = System.currentTimeMillis();
    41. print(10);
    42. System.out.println(System.currentTimeMillis() -start + "ms");
    43. }
    44. }

     6. 当前版本可优化地方,同之前相同,用数组当缓存,存储之前计算得值。他得结果同之前计算得有关系;时间在层数多了之后,速度明显提升

    1. package com.nami.algorithm.study.day09;
    2. /**
    3. * 二维数组记忆法
    4. * beyond u self and trust u self.
    5. *
    6. * @Author: lbc
    7. * @Date: 2023-09-20 14:32
    8. * @email: 594599620@qq.com
    9. * @Description: keep coding
    10. */
    11. public class PascalTrianglePlus {
    12. public static int calculate(int[][] cache, int i, int j) {
    13. // 判断数组内是否有上一行得值
    14. if (cache[i][j] > 0) {
    15. return cache[i][j];
    16. }
    17. if (i == j || j == 0) {
    18. cache[i][j] = 1;
    19. return 1;
    20. }
    21. // 存入数组,方便下次使用
    22. cache[i][j] = calculate(cache, i - 1, j - 1) + calculate(cache, i - 1, j);
    23. return cache[i][j];
    24. }
    25. /**
    26. * 每行空白区域
    27. * @param n
    28. * @param i
    29. */
    30. private static void printSpace(int n, int i) {
    31. // 参数2 与下面打印的 %-4d 的数字有关系,是他的一半
    32. int num = (n - 1 - i) * 2;
    33. for (int j = 0; j < num; j++) {
    34. System.out.print(" ");
    35. }
    36. }
    37. public static void print(int row) {
    38. // 使用二维数组记忆法
    39. // 也可以使用map,但是感觉没有数组简洁,map占用更大
    40. int[][] cache = new int[row][];
    41. for (int i = 0; i < row; i++) {
    42. cache[i] = new int[i + 1];
    43. printSpace(row, i);
    44. for (int j = 0; j <= i; j++) {
    45. // System.out.print(calculate(i, j) + " ");
    46. System.out.printf("%-4d", calculate(cache, i, j));
    47. }
    48. System.out.println();
    49. }
    50. }
    51. public static void main(String[] args) {
    52. long start = System.currentTimeMillis();
    53. print(50);
    54. // 当打印30层时候,二者速度:1700ms, 18ms
    55. System.out.println(System.currentTimeMillis() -start + "ms");
    56. }
    57. }

    7. 非递归方式解决,采用直接计算好每行的值

    1. package com.nami.algorithm.study.day09;
    2. /**
    3. * 非递归方式
    4. * beyond u self and trust u self.
    5. *
    6. * @Author: lbc
    7. * @Date: 2023-09-20 14:32
    8. * @email: 594599620@qq.com
    9. * @Description: keep coding
    10. */
    11. public class PascalTriangleUltra {
    12. public static void createRow(int[] row, int i) {
    13. if (i == 0) {
    14. row[0] = 1;
    15. return;
    16. }
    17. for (int j = i; j > 0; j--) {
    18. row[j] = row[j] + row[j - 1];
    19. }
    20. }
    21. private static void printSpace(int n, int i) {
    22. // 参数2 与下面打印的 %-4d 的数字有关系,是他的一半
    23. int num = (n - 1 - i) * 2;
    24. for (int j = 0; j < num; j++) {
    25. System.out.print(" ");
    26. }
    27. }
    28. public static void print(int row) {
    29. // 使用二维数组记忆法
    30. // 也可以使用map,但是感觉没有数组简洁,map占用更大
    31. int[] cache = new int[row];
    32. for (int i = 0; i < row; i++) {
    33. createRow(cache, i);
    34. printSpace(row, i);
    35. for (int j = 0; j <= i; j++) {
    36. // System.out.print(calculate(i, j) + " ");
    37. System.out.printf("%-4d", cache[j]);
    38. }
    39. System.out.println();
    40. }
    41. }
    42. public static void main(String[] args) {
    43. long start = System.currentTimeMillis();
    44. print(10);
    45. // 当打印40层时候 , plus ,ultra 二者速度:21ms, 21ms 差不多
    46. System.out.println(System.currentTimeMillis() - start);
    47. }
    48. }

     

  • 相关阅读:
    3.8 C++高级编程_Android轻量级指针
    主库添加temp文件,dg端不会同步增加temp文件的验证
    Python打包成exe文件
    Jmeter 多实例压测
    沃尔玛ERP系统定制哪家好?
    利用ansbile部署lamp并部署Discuz(非分布式)
    子序列的数目
    【机器学习基础】决策树(Decision Tree)
    qemu虚拟化环境dpdk网卡tcp offloading
    Electron-builder打包和自动更新
  • 原文地址:https://blog.csdn.net/qq_33919114/article/details/133089247