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
文章版权归作者所有,未经允许请勿转载。
热门文章
- 1月10日|22M/S,Shadowrocket/Clash/SSR/V2ray免费节点订阅链接每天更新
- 1月2日|22.9M/S,SSR/Shadowrocket/Clash/V2ray免费节点订阅链接每天更新
- 12月25日|18.4M/S,Shadowrocket/SSR/Clash/V2ray免费节点订阅链接每天更新
- 12月19日|22M/S,V2ray/Shadowrocket/SSR/Clash免费节点订阅链接每天更新
- 1月1日|19.9M/S,SSR/Shadowrocket/V2ray/Clash免费节点订阅链接每天更新
- 12月20日|19.6M/S,V2ray/Clash/Shadowrocket/SSR免费节点订阅链接每天更新
- 12月31日|18.9M/S,Shadowrocket/SSR/Clash/V2ray免费节点订阅链接每天更新
- 12月28日|18.5M/S,V2ray/SSR/Shadowrocket/Clash免费节点订阅链接每天更新
- 1月9日|21.6M/S,Clash/SSR/Shadowrocket/V2ray免费节点订阅链接每天更新
- 12月26日|20M/S,V2ray/SSR/Shadowrocket/Clash免费节点订阅链接每天更新
最新文章
- 1月17日|19.7M/S,V2ray/SSR/Clash(小猫咪)免费节点订阅链接每天更新
- 1月16日|22.6M/S,SSR/V2ray/Clash(小猫咪)免费节点订阅链接每天更新
- 1月15日|22.7M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 1月14日|21.2M/S,SSR/Shadowrocket/V2ray/Clash免费节点订阅链接每天更新
- 1月13日|18M/S,Shadowrocket/SSR/V2ray/Clash免费节点订阅链接每天更新
- 1月12日|19.6M/S,SSR/Shadowrocket/Clash/V2ray免费节点订阅链接每天更新
- 1月11日|18.5M/S,SSR/V2ray/Clash/Shadowrocket免费节点订阅链接每天更新
- 1月10日|22M/S,Shadowrocket/Clash/SSR/V2ray免费节点订阅链接每天更新
- 1月9日|21.6M/S,Clash/SSR/Shadowrocket/V2ray免费节点订阅链接每天更新
- 1月8日|18.7M/S,V2ray/SSR/Shadowrocket/Clash免费节点订阅链接每天更新