递归二字顾名思义就是:递过去,归回来、所以我索性叫它做有借有还吧。

下面的例子由c而来:

public class Main {
                                public static void main(String[] args) {
                                      fun(1);
                                }

                               public static void fun(int n) {
                                      System.out.printf("1-lexe:%d \n", n);   //#1
                                      if (n < 3)
                                            fun(n + 1);
                                      System.out.printf("2-lexe:%d \n", n);   //#2
                                }

                          }

输出的结果如下:

1-lexe:1
                     1-lexe:2
                     1-lexe:3
                     2-lexe:3
                     2-lexe:2
                     2-lexe:1

流程解读:

首先, main() 调用了函数 fun(1) ,于是fun(1)中形参 n 的值是 1, 故打印语句 #1 输出了:1-lexe:1 

然后,由于 n < 3 ,( 第 2 级 )的fun(n+1)被调用. 此时n+1=2,故打印语句 #1 输出了:1-lexe:2。

然后,由于 n < 3 ,( 第 3 级 )的fun(n+1)被调用. 此时n+1=3,故打印语句 #1 输出了:1-lexe:3。

            由于此时,n=3 , 不再执行if语句。

然后执行 #2 语句 , 因为此时 n 的值为 3 , 故打印语句 #2 输出了: 2-lexe:3 。  ---------------------------这时完成了一个“递过去”

 

            此时函数调用完成         

            现在函数需要“归回来” , 回到最后一次调用函数的地方 , 即 n+1=2 的地方 , 故打印语句 #2 输出了:2-lexe:2。

            再返回上一级调用的地方 , n =1 的地方 , 故打印语句 #2 输出了:2-lexe:1。-----------------------------完成了一个“归回来“

            

            其实他的”归回来“的切入点就是函数的调用点 ,获取此处的参数值 , 一级一级的往外突围就出来了。

下面附上一个运算的递归流程:http://www.cnblogs.com/OldZhao/p/5062582.html

05-11 10:54