递归算法

递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。

 说白了就是自己调自己

 下面主要通过一个小栗子就行说明:九九乘法表

 如图为通过for循环完成

 public static void test() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i + "*" + j + "=" + i * j + " ");
            }
            System.out.println();
        }
    }

下图为通过递归完成

 /**
     * 九九乘法表
     *
     * @param m 初始值:9
     */
    public static void test2(int m) {
        if (m == 1) {
            System.out.println(1 + "*" + 1 + "=" + 1 * 1 + " ");
        } else if (m > 1) {
            test2(--m);
            for (int i = 1; i <= m; i++) {
                System.out.print(i + "*" + m + "=" + i * m + " ");
            }
            System.out.println();
        }
    }

程序执行时每一个方法调用都会产生一个栈帧,这个过程称为压栈,在上面递归调用时会进行压栈,然后进行弹栈,方法栈中栈帧的图如下:

递归算法_第1张图片
上面程序执行,参数m=9,执行test2()时,会进行压栈。当执行到 test2(--m);因为进行了递归,所有又会进行压栈,依次类推,直到m=1,压栈完成之后,会依次进行弹栈,直到所以的逻辑代码运行完。

相应的test()只会进行一次压栈。

所有test()跟test()2做相应的比较:

栈 主要是用来存放栈帧的,每执行一个方法就会出现压栈操作,所以采用递归的时候产生的栈帧比较多,递归就会影响到内存,非常消耗内存,而使用for循环就执行了一个方法,压入栈帧一次,只存在一个栈帧,所以比较节省内存。

你可能感兴趣的:(算法)