[Java]递归

本文深入介绍了递归的概念,通过举例说明如何使用递归计算阶乘、顺序打印数字以及求解斐波那契数列。递归需要满足将原问题分解为子问题和存在递归出口的条件。同时,文章还探讨了调用栈在方法调用过程中的作用,解释了栈帧如何存储方法调用的相关信息。示例代码展示了递归在实际编程中的应用,帮助读者更好地理解和掌握递归思想。
摘要由CSDN通过智能技术生成

递归的概念

一个方法在执行过程中调用自身, 就称为 "递归".
递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式.

例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!

递归的必要条件:

  1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
  2. 递归出口

代码示例:顺序打印1-9

    public static void print(int n){
        if (n == 1){
            System.out.println(n);
        }else {
            print(n - 1);
            System.out.println(n);
        }
    }
    public static void main(String[] args) {
        print(9);
    }

运行结果

关于 "调用栈"
方法调用的时候, 会有一个 "栈" 这样的内存空间描述当前的调用关系. 称为调用栈.
每一次的方法调用就称为一个 "栈帧", 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息.
后面我们借助 IDEA 很容易看到调用栈的内容.

 代码示例:1234的每一位相加

    public static int sumFunc(int n){
        if (n < 10){
            return n;
        }else {
            int ret = sumFunc(n / 10) + n % 10;
            return ret;
        }
    }
    public static void main(String[] args) {
        System.out.println(sumFunc(1234));
    }

 运行结果

 

代码示例:求斐波那契数列的第 N 项

    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }
    public static int fib2(int n){
        if (n == 1 || n == 2) {
            return 1;
        }
        int f1 = 1;
        int f2 = 1;
        int f3 = 0;
        for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }
    public static void main(String[] args) {
        System.out.println(fib2(1));
        System.out.println(fib2(2));
        System.out.println(fib2(3));
        System.out.println(fib2(4));
    }

 运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值