java递归实现

二话不说,先上代码
java

Java代码  
  1. public class TestRecursion{   
  2.     //递归方法   
  3.     public static  void fun(int i){   
  4.         if(i > 0){   
  5.             i--;   
  6.             fun(i);   
  7.             System.out.print(i);   
  8.         }   
  9.         System.out.print(" ok ");   
  10.     }   
  11.     public static void main(String args[]){   
  12.         fun(10);   
  13.     }   
  14. }  



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

 小程序

Java代码  
  1. public void a(){}   
  2. public void b(){   
  3.     System.out.println("Hello");   
  4.     a();   
  5.     System.out.println("boy");   
  6. }  



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

 ide

Java代码  
  1. 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.看下面的代码

 url

Java代码 
  1. public static  void fun(int i){//此时i==1   
  2.     if(i > 0){//yes   
  3.         i--; //此时i==0了   
  4.         fun(i);//即fun(0)   
  5.         System.out.print(i);//i==?   
  6.     }   
  7.     System.out.print(" ok ");   
  8. }  



继续分析:打印"0",又打印" ok ",以后fun(1)方法结束了,返回到fun(2)调用fun(1)的下一条语句,System.out.print(i),此时i=1,依次类推。
spa

相关文章
相关标签/搜索