怎么求递归调⽤次数_Java基础学习之递归
⼀、什么是递归呢?
递归举例:
从前有⼀座⼭,⼭⾥有座庙,庙⾥有个⽼和尚,⽼和尚在给⼩和尚讲故事:
从前有⼀座⼭,⼭⾥有座庙,庙⾥有个⽼和尚,⽼和尚在给⼩和尚讲故事:
从前有⼀座⼭,⼭⾥有座庙,庙⾥有个⽼和尚,⽼和尚在给⼩和尚讲故事:
。。。。。。。
故事如何才能结束:⼩和尚还俗了。庙塌了。⼭崩了。
Java中的递归:
在⽅法的函数体中⼜调⽤了⽅法⾃⼰本⾝。
递归调⽤的细节:必须要求递归中有可以让函数调⽤的结束条件。否则函数⼀直调⽤,就会导致内存溢出。⼆、递归累和
计算1 ~ 5的和
练习1:需求:计算1~5的和值,不许使⽤循环。
实现代码:
实现代码
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~5的和,使⽤递归完成
int n = 5;
// 调⽤求和的⽅法
int sum = getSum(n);
// 输出结果
System.out.println(sum);
}
/*学习java的学习方法
通过递归算法实现.
参数列表:int
返回值类型: int
*/
public static int getSum(int n) {
/*
n为1时,⽅法返回1,
相当于是⽅法的出⼝,n总有是1的情况
*/
if(n == 1){
return 1;
}
/*
n不为1时,⽅法返回 n +(n-1)的累和
递归调⽤getSum⽅法
*/
return n + getSum(n-1);
}
}
代码执⾏图解
⼩贴⼠:递归⼀定要有条件限定,保证递归能够停⽌下来,次数不要太多,否则会发⽣栈内存溢出。
三、递归求阶乘
练习2:需求:求5的阶乘!!
分析:
普及⼀下数学知识:
使⽤递归思想来完成
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! =1*0!
规律:n! = n * (n-1)!
补充:0!等于1
结束条件:if(n <= 1) return 1;
递归⽅式:
代码如下所⽰:
步骤:
1)定义⼀个DiGuiDemo3测试类;
2)在这个类中的main函数中调⽤⾃定义函数jc2(),5作为函数的参数,使⽤⼀个变量result来接收返回的阶乘的值,并输出结果result;3)⾃定义jc2()函数接收传递的参数5;
4)在⾃定义函数中书写if语句判断n是否⼩于等于1,如果⼩于等于1,则使⽤return返回1;
5)否则n>1时,使⽤return返回n * jc2(n - 1);
package cn.itcast.sh.digui.demo;
/*
* ⽅式2:使⽤递归思想来解决5的阶乘
*⽅式⼀: 5!=5*4*3*2*1;
*⽅式⼆:5!=5*4!
* 4!=4*3!
* 3!=3*2!
* 2!=2*1!
* 1!=1*0!
*规律:n!=n*(n-1)!
*结束条件:
* if(n<=1) return1;
*/
public class DiGuiDemo3 {
public static void main(String[] args) {
// 调⽤函数求5的阶乘
int result=jc2(5);
System.out.println(result);//120
}
//⾃定义函数求5的阶乘
public static int jc2(int n) {
// 结束条件
if(n<=1)
{
return 1;
}
return n*jc2(n-1);
}
}
上述代码内存图解如下所⽰:
四、递归注意事项
1、递归必须有结束条件,否则栈内存会溢出,称为死递归!栈炸了。
栈内存溢出报的异常如下所⽰:
2、递归次数不能太多,否则栈溢出。炸了
栈内存溢出报的异常如下所⽰:
总结:递归容器容易导致内存溢出。即使递归调⽤中有结束条件,但是如果递归的次数太多,也会发⽣内存溢出。所以在开发中使⽤函数的递归调⽤时需谨慎。
五、递归打印所有⼦⽬录中的⽂件路径
需求:扫描D:test所有⼦⽂件夹及⼦⼦⽂件夹下的.jpg⽂件,输出其绝对路径。
分析:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论