Java代码

public class TestRecursion{
//递归方法
public static void fun(int i){
if(i > 0){
i--;
fun(i);
System.out.print(i);
}
System.out.print(" ok ");
}
public static void main(String args[]){
fun(10);
}
}



这段代码看似简单,其中的奥秘你却未必尽知。
首先.什么是递归?相信大家都知道,就是方法直接或间接地调用自身。
要想深入理解递归,得从栈的角度去看待方法间的调用。
先来看一个简单的例子:


Java代码

public void a(){}
public void b(){
System.out.println("Hello");
a();
System.out.println("boy");
}



方法b()调用了方法a(),此时程序不再顺序执行,而是发生跳转。CPU首先将下一条机器指令的地址以及相关的参数信息压入栈中,然后程序跳转到a()的方法体中。当a()方法返回时,CPU会执行出栈操作,取出上一次存储的机器指令的地址以及参数信息,即System.out.println("boy")(当然了,System.out.println()不是一条机器指令,而是被翻译成多条机器指令)
递归方法也是一个道理,只不过,调用者与被调用者是同一个方法。
递归与循环的有些相似,但又截然不同。循环没有方法间的调用关系,也就没有指令地址的压栈、出栈,它仅仅指令地址的改变。
现贴出TestRecursion小程序的输出结果:


Java代码

ok 0 ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok



分析调用过程:fun(10)->fun(9)->fun(8)->fun(7)->fun(6)->fun(5)->fun(4)->fun(3)->fun(2)->fun(1)->fun(0)
我们倒过来分析:当i=0时,首次不满足i>0的条件,所以首先打印“ok"。然后fun(0)结束了,返回到fun(1)中,执行调用fun(0)的下一条语句,即System.out.print(i),此时i=0.肯定有的朋友不明白为什么这里i=0.看下面的代码

Java代码

public static void fun(int i){//此时i==1
if(i > 0){//yes
i--; //此时i==0了
fun(i);//即fun(0)
System.out.print(i);//i==?
}
System.out.print(" ok ");
}
优质内容筛选与推荐>>
1、当music-list向上滑动的时候,设置layer层,随其滚动,覆盖图片,往下滚动时候,图片随着展现出来
2、摘抄
3、数据库mysql中distinct关键词
4、职业类型测试结果
5、采购订单行号不能大于6位数字


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号