递归

递归

定义:使用被定义对象的自身来为其下定义。

递归就是自己调用自己,有点类似于套娃,一层套一层。举个例子,就好比排队的时候报号反过来,就是相当于从最后一个人开始。但是他不知道自己是几号,所以他要问前面一个人是几号,然后推算出自己是几号。但是他前面的那个人也不知道自己是几号,所以他也要问......一直问到第一个人。然后第一个人告诉第二个人自己是一号,然后第二个人才知道自己是二号,然后......一直到最后那个人。

递归结构:

  • 递归头:什么时候不调用自身方法。(一定要有递归头,不然就会陷入死循环!递归头的条件不一定要等于1!)
  • 递归体:什么时候需要调用自身方法。

例:

  public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int sum = scanner.nextInt();
            System.out.println(f(sum));
        }
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }else{
            return n*f(n-1);
        }
    }

一个简单的循环输入整数,输出乘方的方法。输出结果如下:

其中f方法就是使用了递归。用3的乘方举例,方法为f(3),n等于3,3不等于1,所以执行else语句里面的命令:返回3 * f(3-1),然后我们再执行f(3-1),即f(2),n等于2,2不等于1执行else语句:2 * f(2-1),f(2-1)即f(1),n等于1,满足条件,返回1,然后倒回去,f(2)就是2 * 1,f(3)就是3 * 2 * 1=6。

简单图解:

main方法将参数3传递给f方法,然后f(3)执行 return n * f(n-1);命令,将参数2再传递给自己(传递给f方法),f(2)执行return n * f(n-1);,将参数1再传递给自己,因为f(1)返回1,所以再倒回去......最后f(3)返回(3 * 2 * 1=)6给main方法。

递归的优缺点:

  • 优点:代码更简洁清晰,可读性更好。
  • 缺点:时间和空间消耗比较大;很多计算都是重复的;调用栈可能会溢出

递归是一种较为简便、非常重要的算法,在涉及到一些数值不大的运算的时候可以考虑使用,但是如果数值太大则不可使用,任意发生栈的溢出,也会消耗大量计算机的内存资源。

posted on 2022-08-11 23:39  沁鱼  阅读(97)  评论(0)    收藏  举报