关于递归的一些想法

1.什么是递归

        说白了,就是在方法中调用该方法;因为要不断调用自身,所以需要设置一个退出递归调用的终止条件,每次调用都要判断本次调用是否满足终止条件,如果满足,则逐层退出递归。

2.例子

class Test {
    public int add(int a){
        if(a == 1)
            return 1;
        else
            return add(a-1)+a;
    }

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.add(5));
    }
}

        上述示例中,为了计算5的阶乘,add方法中又调用了add方法。但每轮都要判断是否等于1。最终输出15。

进栈出栈流程如下:

3.思考

        当递归进行到最底层,即满足结束条件时,返回某个值;处于倒数第二层的式子收到最底层的返回值,就可以进行运算,并继续执行代码,得到结果并返回倒数第三层,依此类推,最终得到顶层的结果。

        由此可见,递归天然具有回溯的性质,递归本质是不断利用栈保存未得到结果的式子,直至最底层结果得到,再逐层回溯,得到最终结果。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常好的问题!斐波那契数列是由0、1开始,后面的每一项都是前两项的和。所以斐波那契数列的前几项如下: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144... 接下来,我会先讲解如何用递归实现斐波那契数列的第n项,然后再介绍如何用迭代实现。 递归实现 递归实现斐波那契数列的思路很简单:对于斐波那契数列的第n项,我们可以先求出第n-1和n-2项,然后将它们相加即可。而对于第n-1和n-2项,我们同样可以用同样的方式求出。 根据递归的思路,我们可以定义一个递归函数,代码如下: int fibonacci_recursion(int n) { if (n <= 0) return 0; else if (n == 1) return 1; else return fibonacci_recursion(n-1) + fibonacci_recursion(n-2); // 递归调用 } 上面的代码先判断了一下n的值是否小于等于0或等于1,这是为了避免递归陷入无限循环。如果n等于0,则返回0;如果n等于1,则返回1。否则,我们将递归调用fibonacci_recursion(n-1)和fibonacci_recursion(n-2),并将它们相加返回。 但是,这个递归实现有一个很明显的问题:当n比较大时,递归会变得非常的深,这会导致函数调用栈溢出。因此,我们需要用迭代来替代递归。 迭代实现 迭代实现斐波那契数列的思路与递归实现基本一致,只是用循环替代了递归。我们首先初始化前两项为0和1,并用循环依次计算出后面的每一项。 具体实现如下: int fibonacci_iteration(int n) { if (n <= 0) return 0; else if (n == 1) return 1; int a = 0, b = 1, c; for (int i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } 上面的代码中,我们先判断了一下n的值,如果n等于0,则返回0,如果n等于1,则返回1。然后,我们用a初始化为0,b初始化为1,依次计算出后面的每一项。具体实现如下: - 首先,我们将a和b的值相加,将结果赋值给变量c。 - 然后,将b的值赋给a,将c的值赋给b。 - 最后,当i>n时,返回变量b即可。 这个迭代实现的想法很简单,而且循环的次数只有n-1次,因此它是比递归实现更加高效的一种实现方法。 总结 斐波那契数列是一道经典的算法题,也是算法和程序设计中很重要的一个概念。我们用递归和迭代分别实现了斐波那契数列的第n项,递归实现简单,但会导致函数调用栈溢出;迭代实现思路相对复杂,但是效率更高,不会出现函数调用栈溢出的问题。我希望我的回答能够帮助你更好地理解斐波那契数列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值