:递归 -- 递归

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:递归 -- 递归相关的知识,希望对你有一定的参考价值。

1. 递归


1.1 递归的概念

递归就是方法自己去调用自己,每次调用时传入的参数是不同的,递归有助于解决程序中复杂的问题,同时可以让代码更为简洁。可以将问题分为同一类型的子问题(分治策略),递归的核心是分治策略,递归必须有一个逼近于终点的条件


1.2 递归可以解决的问题

  1. 可以解决各种数学问题,汉若塔,迷宫问题, 8皇后问题等等
  2. 各种算法的递归,如快排,归并排序,二分查找,分治算法等

1.3 递归的规则

  1. 执行一个方法时,就创建一个新的受保护的独立栈空间
  2. 方法的局部变量是独立的,不会相互影响。
  3. 如果方法中使用的是引用型类型变量,比如数组,则会共享引用型的数据
  4. 递归必须向退出递归的条件接近,否则就是无线递归,会出现StackOverflowError。
  5. 一个方法执行完毕后,或者遇到return,会就返回数据,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

2. 示例

public class multiProblem 
    public static void main(String[] args) 
        System.out.println(factorial(1));
        System.out.println(factorial(2));
        System.out.println(factorial(3));
        System.out.println(factorial(4));
    

    public static int factorial(int n) 
        if (n == 1) 
            return 1;
         else 
            return factorial(n - 1) * n;
        
    


运行结果:

代码分析:
n=1 ,进入if语句 n==1 -> true  -> return 1
n=2 ,进入else语句 -> return factorial(2 - 1) * 2 ->  return factorial(1) *2 -> return 1 * 2
n=3 ,进入else语句  -> return factorial(3 - 1) * 3 -> return factorial(2) * 3 -> return 1 * 2 * 3
n=4 ,进入else语句  -> return factorial(4 - 1) * 3 -> return factorial(3) * 4 -> return 1 * 2 * 3 * 4

补充:演示栈溢出异常

public class sortProblem 
    public static void main(String[] args) 
        test(4);
    

    public static void test(int n) 
        if (n > 2) 
            test(n + 1);
        
        System.out.println("n: " + n);
    

运行结果:



以上是关于:递归 -- 递归的主要内容,如果未能解决你的问题,请参考以下文章

递归与非递归的转换

尾递归和线性递归

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

Koltin 递归尾递归和记忆化

递归4之递归的利弊

递归4之递归的利弊