简介递归

112 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解递归,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

递归

什么是方法递归?

方法自己调用自己就是递归

当递归程序没有结束条件时

一定会发生栈内存溢出错误:stackOverFlowError,,所以递归一定要有结束条件

有结束条件的递归就一定不会栈溢出吗?

不一定,若结束条件合法,仍有可能发生栈溢出错误。因为,栈的内存是有限的,如果递归的太深,一直压栈而不弹栈,依旧会发生栈溢出

如何解决栈溢出错误?

 第一步:
     先检查递归的结束条件对不对。如果递归结束条件不对,
     必须对条件进一步修改,直到正确为止。
 ​
 第二步:假设递归条件没问题,怎么办?
     这个时候需要手动的调整JVM的栈内存初始化大小。
     可以将栈内存的空间调大点。(可以调整大一些。)
                 
 第三步:调整了大小,如果运行时还是出现这个错误,
     没办法,只能继续扩大栈的内存大小。
     java -X)这个可以查看调整堆栈大小的参数

栗子: 比较递归与非递归

 // 先不使用递归,请编写程序,计算1~n的和。
 public class RecursionTest02{
     public static void main(String[] args){
         // 1~10的和
         int retValue1 = sum(10);
         System.out.println(retValue1);
 ​
         // 1~3的和
         int retValue2 = sum(3);
         System.out.println(retValue2); // 6 (1 + 2 + 3)
     }
 ​
     // 单独编写一个计算1~n和的方法
     public static int sum(int n){
         int result = 0;
         for(int i = 1; i <= n; i++){
             result += i;
         }
         return result;
     }
 }
 ​
 ​
 // 使用递归,请编写程序,计算1~n的和。
 public class RecursionTest03{
     public static void main(String[] args){
         // 1~3的和
         int n = 3;
         int r = sum(n);
         System.out.println(r); // 6
     }
 ​
     // 大家努力的去看,去听,自己写不出来没关系,关键是能不能看懂。
     // 单独编写一个计算1~n和的方法
     // 这个代码修改为递归的方式。
     // 3 + 2 + 1
     public static int sum(int n){
         //n最初等于3
         // 3 + 2 (2是怎么的出来的:n - 1)
         //sum(n - 1); 
         if(n == 1){
             return 1;
         }
         // 程序能执行到此处说明n不是1
         return n + sum(n-1);
     }
 }

栗子:递归求N的阶乘

 // 用递归的方式实现一个。
 // 使用for循环的方式实现一个。
 public class RecursionTest04{
 ​
     public static void main(String[] args){
         int n = 5;
         int jieGuo = jieCheng(n);
         System.out.println(jieGuo); // 120
 ​
         System.out.println(jieCheng2(5));
     }
 ​
     public static int jieCheng2(int n){
         int result = 1;
         for(int i = 2; i <= n; i++){
             result *= i;
         }
         return result;
     }
 ​
     public static int jieCheng(int n){
         // 5 * 4 * 3 * 2 * 1
         if(n == 1){
             return 1;
         }
         /*
         int result = n * jieCheng(n - 1);
         return result;
         */
 ​
         return n * jieCheng(n - 1);
     }
 }