递归
作者:互联网
递归
递归调用
方法自己能不能够调用自己的方法
// 发动的方法
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