对递归的一点理解

递归方法就是直接或间接调用自身的方法。

  • 最简单的情况称为基础情况或终止条件;
  • 而遇到其余情况就应将问题简化为子问题,子问题在本质上和原始问题是一样的,但是更简单也更小。

因为子问题与原始问题具有相同的性质,所以可以用不同的参数来调用这个方法,这称作递归调用。
递归实现简单、直接,但是并不高效。
下面以计算斐波纳挈数为例解释调用过程:
java code:

import java.util.Scanner;

public class ComputeFibonacci{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        System.out.print("Enter an index for the Fibonacci number: ");
        int index=input.nextInt();

        System.out.println("Fibonacci number at index "+index+" is "+fib(index));

    }

    public static long fib(long index){
        if(index==0)
            return 0;
        else if(index==1)
            return 1;
        else
            return fib(index-1)+fib(index-2);
    }
}

fib(4)

在Java中,操作数是从左向右计算的,所以在完全计算完fib(3) 后才会调用fib(2)。
步骤如下标号:
steps

从这里我们可以看到会出现很多重复的递归调用,而除了大量的递归调用,计算机还需要更多的时间和空间来运行递归的方法。
递归程序可能会耗尽内存,引起StackOverflowError。
任何用递归解决的问题都可以用迭代非递归地解决。那么我们为什么还要用递归呢?因为在某些情况下,本质上有递归特性的问题很难用其他方法解决,而递归可以给出一个清晰、简单的解决方案。(例如:目录大小问题、汉诺塔问题和分形问题,不使用递归很难解决)
从某种程度上讲,递归提供了某种层次的抽象,这种抽象对用户隐藏迭代和其他细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值