本文已参与[新人创作礼]活动,一起开启掘金创作之路。
哈喽,大家好!我是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);
}
}