标签:return 递归 int number num fibonacci
递归
递归调用
方法自己能不能够调用自己的方法
// 发动的方法
public void run(){
run();
System.out.println("汽车启动啦!");
}
这玩意直接报错了:
Exception in thread "main" java.lang.StackOverflowError
at com.ydlclass.Car.run(Car.java:16)
at com.ydlclass.Car.run(Car.java:16)
at com.ydlclass.Car.run(Car.java:16)
说是栈内存溢出了:什么原因呢?每个方法的创建都会创建一个【栈帧】压入栈中。
所以,在使用递归的时候一定要注意,用不好,会发生栈内存溢出的问题。那怎么用好递归呢?
答案是:在合适的地方退出递归调用
斐波那切数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……
特别指出:第0项是0,第1项是第一个1。
这个数列从第三项开始,每一项都等于前两项之和。
求:在斐波那契数列中第 number个数字是多少?
分析:我们知道 除了第0个和第1个,【第number个数字】一定等于 【第number-1个数字】和 【第number-2个数字】之和。
public long fibonacci(long number) {
return fibonacci(number - 1) + fibonacci(number - 2);
}
上边这个递归永远退不出去,应该判断number在0和1的时候,它并不需要递归,修改如下:
public long fibonacci(long number) {
if ((number == 0) || (number == 1))
return number;
else
return fibonacci(number - 1) + fibonacci(number - 2);
}
Test test = new Test();
long result = test.fibonacci(5);
System.out.println(result);
结果:
5
【注意】:递归,一定要有合理的退出机制。
public class Recursion {
public int fibonacci(int num){
//递归是方法自己调用自己,在此fibonacci(int num)方法调用了fibonacci(num-1) + fibonacci(num-2),
// 并且有if (num == 0 || num == 1){return num;作为退出
if (num == 0 || num == 1){
return num;
}else {
return fibonacci(num-1) + fibonacci(num-2);
}
}
//for循环写的求传入参数的阶乘方法
public int factorial(int num){
int result = 1;
for (int i = 1; i <= num; i++) {
result *= i;
}
return result;
}
//递归写的求传入参数的阶乘方法
public int factorial1(int num1){
if (num1 == 1){
return 1;//递归退出
}
return num1 * factorial1(num1-1);
}
public static void main(String[] args) {
Recursion recursion = new Recursion();
int fib = recursion.fibonacci(10);
System.out.println(fib);
int fac = recursion.factorial(3);
System.out.println(fac);
int fac1 = recursion.factorial1(8);
System.out.println(fac1);
}
}
55
6
40320
Process finished with exit code 0
标签:return,递归,int,number,num,fibonacci 来源: https://www.cnblogs.com/zuifengdeyang/p/16268413.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。