**递归**(英语:Recursion),又译为**递回**,在[数学](https://zh.wikipedia.org/wiki/数学)与[计算机科学](https://zh.wikipedia.org/wiki/计算机科学)中,是指在[函数](https://zh.wikipedia.org/wiki/函数)的定义中使用函数自身的方法。递归一词还较常用于描述以[自相似](https://zh.wikipedia.org/wiki/自相似)方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

递归简单的小例子

用递归计算1+2+。。。+1000的和

public class d {

    int sum=0;
    int i=1;
    public void sum(){
        sum+=i;
        i++;
        if(i<=1000){
            sum();//递归就是调用自身
        }
    }
public static void main(String[] args) {
    d s = new d();
    s.sum();
    System.out.println("计算结果是"+s.sum);
}
}

用递归进行数字的阶乘

package cn.sakura521.recursive;

public class Factorial {

    int fact(int n) {
        int result;
        if (n == 1) {
            return 1;
        }
        result = fact(n - 1) * n;
        return result;
    }


    public static void main(String[] args) {

        Factorial factorial = new Factorial();

        System.out.println(factorial.fact(6));
    }

}

用递归实现斐波那契数列

package cn.sakura521.recursive;

public class Fibonacci {
    //写法一
    int sum(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }
        return sum(n - 1) + sum(n - 2);
    }

    //写法二
    int Fib(int n) {
//        return n < 3 ? 1 : (Fib(n - 1) + Fib(n - 2));
        return n == 0 ? 0 : n < 3 ? 1 : (Fib(n - 1) + Fib(n - 2));
    }


    public static void main(String[] args) {
        Fibonacci f = new Fibonacci();
        System.out.println(f.sum(5));
        System.out.println(f.Fib(5));
    }


}

用递归打印数组前values 中的前 i 个元素

package cn.sakura521.recursive;

public class RecTest {

    int values[];

    RecTest(int i) {
        values = new int[i];
    }

    void printArray(int i) {
        if (i == 0) {
            return;
        } else {
            printArray(i - 1);
        }
        System.out.println("[" + (i - 1) + "]" + values[i - 1]);

    }

    public static void main(String[] args) {
        int m = 10;
        RecTest recTest = new RecTest(m);
        int i;
        for (i = 0; i < m; i++) {
            recTest.values[i] = i;
        }
        recTest.printArray(m);
    }


}

递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推关键要抓住的是:
(1)递归出口
(2)地推逐步向出口逼近
得解。


Keep on going never give up