递归(阶乘、汉诺塔问题)

阶乘(引入)

举一个简单阶乘案例
n! = n (n-1)(n-2)21
n! = n * (n-1)!
(n-1)! = (n-1 )
(n-2)!

2! = 2 * 1!= 2
1! = 1

计算阶乘能够特别好的体现递归的思想

  • 1,把一个复杂的大问题,分解成若干个相似的子问题
    • 2,子问题还能够继续分解
    • 3,最终子问题分解的特别小,小到随便就能知道答案
    • 4,最后,把所有子问题的解合并起来,就是复杂大问题的解

怎么写一个递归

写递归,别的先不想,先想什么时候停下来,先想递归出口
然后再写递归出口

优缺点

递归的优点:能够把大问题分解成小问题,非常利于思考,往往代码也不复杂
但是递归很危险,占用空间,效率也低
正常情况不要使用

java代码实现

    //使用递归求解阶乘
    public static int factorial(int n) {
    
    
        if (n == 1) {
    
    
            return 1;
        } else {
    
    
            return n * factorial(n - 1);
        }
    }

汉诺塔问题(经典)

规则

简单来说:有三个塔1,2,3,塔1上有 N 个(N>1)穿孔圆盘,大盘在下,小盘在上
要求按下列规则将所有圆盘移至塔3:

  • ​ 1,每次只能移动一个圆盘
  • ​ 2,大盘一定在小盘之下

思路

实际上无论n等于几,都可以总结出一个规律

第一部分:把除了最大的盘子之外的所有盘子,都移到辅助的塔2中
第二部分:把大盘从塔1移到塔3
第三部分:再通过塔1去辅助,把塔2中除了最大盘子之外的所有盘子,移到塔3

实现


斐波那契数列

规则

输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值

1 1 2 3 5 8 13 21 34 55

规律:一个数等于前两个数之和
要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来

实现

猜你喜欢

转载自blog.csdn.net/AC_872767407/article/details/113391313