递归有两个特点:

  • 调用自身
  • 结束条件

image.png

  • 左上:死递归,没有结束条件
  • 右上:合法递归,比方说x=3,永远不会结束
  • 左下:不合法
  • 右下:合法

    注意:fun3是先打印后递归,所以如果传入3,打印321 fun4先递归后打印,所以如果传入3,打印123

汉诺塔问题

image.png
image.png
思路:上面n-1个盘子堪称一个整体,最后是最大1个盘子
image.png
代码:
image.png

  1. package com.algorithm.demo;
  2. /**
  3. * @Author leijs
  4. * @date 2022/4/9
  5. */
  6. public class Hanoi {
  7. static int i = 0;
  8. public static void main(String[] args) {
  9. // 从A经过B挪到C
  10. // a->c, a->b, b->c
  11. hanoi(64, "A", "B", "C");
  12. System.out.println(i);
  13. }
  14. public static void hanoi(int n, String a, String b, String c) {
  15. if (n > 0) {
  16. hanoi(n-1, a, c, b);
  17. // System.out.println(String.format("moving from %s to %s", a,c));
  18. i++;
  19. hanoi(n-1, b, a, c);
  20. }
  21. }
  22. }

image.png