关于递归,不得不说的

二话不说,先上代码
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);
	}
}

这段代码看似简单,其中的奥秘你却未必尽知。 
首先.什么是递归?相信大家都知道,就是方法直接或间接地调用自身。 
要想深入理解递归,得从栈的角度去看待方法间的调用。 
先来看一个简单的例子:
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小程序的输出结果:
 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.看下面的代码
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 ");
}

继续分析:打印"0",又打印" ok ",之后fun(1)方法结束了,返回到fun(2)调用fun(1)的下一条语句,System.out.print(i),此时i=1,依次类推。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值