脚本宝典收集整理的这篇文章主要介绍了【递归算法01】递归的调用机制,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题的同时让代码变得简洁,化繁为简是其核心思想。
quick sort
),归并排序(merge sort
),二分查找(binary seArch
),分治算法(divide and conquer
)等;我们来看一哈这一段代码:
package com.recursion;
class test{
public void test(int n) {
if (n > 2) {
test(n - 1);
}
System.out.PRintln("n=" + n);
}
}
public class Recursion {
public static void main(String[] args) {
Test t1 = new Test();
t1.test(4); //尝试输出看看
}
}
代码截图:
运行结果: 结果分析: 为了看起来比较规范,首先我们先简单画出JVM
内存区域 ,这里只涉及到栈空间,堆空间和方法区:
main
方法(程序的入口),有C/C++
基础的小伙伴们应该晓得,我们知道在调用方法时,在栈空间中会创建相应的栈帧,main
方法也是一个方法,也会被其他进程调用(main
栈帧。此时new
了一个对象,此对象会在堆中创建,在栈中的引用变量会指向此堆空间,也就是保存了此对象的地址,如图。main
方法中调用了test
方法,所以在栈中也会创建test
栈帧,此时我们传入的n
为4,接下来判断n
大于4吗?很明显大于4,所以在test
栈中又要调用test(n-1)
,也就是调用test(3)
,既然调用了方法,那便又要在栈中创建相应的栈帧,以此类推。test(2)
时,此时判断n
大于2显然为false
,此时便要执行方法的最后一句语句,也就是sout
打印语句,此时便会先打印2,打印完2之后方法结束(被操作系统回收/资源销毁),返回到前一个调用此方法的栈帧中,也是以此类推,直到main
方法结束。我们再来进一步拓展一下上述问题:
源代码:
package com.recursion;
class Test{
public void test(int n) {
if (n > 2) {
test(n - 1);
} else { //唯一区别就是加了else
System.out.println("n=" + n);
}
}
}
public class Recursion {
public static void main(String[] args) {
Test t1 = new Test();
t1.test(4); //尝试输出看看
}
}
代码截图:
运行结果: 尝试自己分析一下⑧,简单来说就是if
执行了else
就不执行,else
执行了说明if
也没执行。
源代码:
package com.recursion;
class Test01 {
public int factorial(int n) {
if (n == 1) {
return 1;
} else {
return factorial(n - 1) * n;
}
}
}
public class Factorial {
public static void main(String[] args) {
Test01 test = new Test01();
int ret = test.factorial(5);
System.out.println("ret=" + ret);
}
}
运行结果:
结果分析: 大体上都跟前面的打印例子差不多,都是调用自身时在栈上开辟相应的栈帧,前面忘说了,栈帧其实会二次开辟的,啥意思呢,就是说调用方法时先在栈上分配一块较大的空间,也就是栈帧,而在栈帧内部还会进行一次具体的内存划分,具体到每一个变量。每个栈帧结束后将返回值返回给上一个栈帧,以此类推就能清晰明了的弄清楚递归的调用机制。以上是脚本宝典为你收集整理的【递归算法01】递归的调用机制全部内容,希望文章能够帮你解决【递归算法01】递归的调用机制所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。