java程序员必备的基础知识_java面向对象之方法的递归

java程序员必备的基础知识之方法的递归

a、方法调用

一个方法中也是可以调用另一个方法的。

我们完全可以把加油和发动分解成两个动作啊,理论上,这也是合 理的,因为这确实是两个动作。

// 发动的方法

public void run(){

addGasoline();

System.out.println("汽车启动啦! ");

}

// 加油的方法

public void addGasoline(){

System.out.println("加油啦! ");

}

b、递归调用

问题来了,方法自己能不能够调用自己的方法

// 发动的方法

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

【注意】:递归,一定要有合理的退出机制。

②、阶乘(factorial)

5的阶乘 = 5*4*3*2*1 = 120

非递归方式:

public long factorial(long number) {   long result = 1;  for (int i = 1; i <= number ; i++) {  result *= i;  }  return result;  }

递归方式:

核心思路: 5的阶乘 = 4的阶乘 * 5 = 3的阶乘 * 4 * 5 = 2的阶乘 * 3 * 4 * 5 = 1 * 2 * 3 * 4 *5;

public long factorial(long number) { if (number <= 1) return 1; return number * factorial(number - 1); }

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-3263.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档