zoukankan      html  css  js  c++  java
  • 递归详解(一)

     1 public class Digui {
     2 
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5           fun(3);
     6     }
     7 
     8     static void fun(int a) {
     9         int i;
    10         System.out.print(a);
    11         for (i = 0; i < a; i++)
    12             fun(a - 1);
    13     }
    14 
    15 }

    输出结果:3210102101021010

    执行过程

     这么讲吧:
    fun(3);//初始调用时,a值等于3

    为了方便说,后面调用fun函数时,a值等于几,就叫几号递归
    fun(3)//3号递归开始执行
    运行printf("%d ",a); //输出3
    运行for循环,i=0,i<3,
    调用fun(3-1)

    fun(2)//2号递归开始执行
    运行printf("%d ",a); //输出2
    运行for循环,i=0,i<2,
    调用fun(2-1)

    fun(1)//1号递归开始执行
    运行printf("%d ",a); //输出1
    运行for循环,i=0,i<1,
    调用fun(1-1)

    fun(0)//0号递归开始执行
    运行printf("%d ",a); //输出0
    运行for循环,i=0,i<0,不成立

    ------------------------>至此,输出了3,2,1,0

    0号递归不成立后,回归1号递归的for循环处,进行i++处理,
    运行for循环,i=1,i<1,不成立

    1号递归不成立后,回归2号递归的for循环处,进行i++处理,
    运行for循环,i=1,i<2,
    调用fun(2-1)
    再度运行fun(1)//1号递归
    从上面可以看出,1号递归的运行会输出1,0

    ------------------------>至此,输出了3,2,1,0,1,0

    1号递归不成立后,回归2号递归的for循环处,进行i++处理,
    运行for循环,i=2,i<2,不成立

    2号递归不成立后,回归3号递归的for循环处,进行i++处理,
    运行for循环,i=1,i<3,
    调用fun(3-1)
    再度运行fun(2)//2号递归
    从上面可以看出,2号递归的运行会输出2,1,0,1,0

     ------------------------>至此,输出了3,2,1,0,1,0,2,1,0,1,0

    2号递归不成立后,回归3号递归的for循环处,进行i++处理,
    运行for循环,i=2,i<3,
    调用fun(3-1)
    再度运行fun(2)//2号递归
    从上面可以看出,2号递归的运行会输出2,1,0,1,0

    ------------------------>至此,输出了3,2,1,0,1,0,2,1,0,1,0,2,1,0,1,0

    2号递归不成立后,回归3号递归的for循环处,进行i++处理,
    运行for循环,i=3,i<3,不成立

    至此递归结束

    所以最后输出结果为:
    3 2 1 0 1 0 2 1 0 1 0 2 1 0 1 0

    进一步的,将函数改为:

     1 public class Digui {
     2 
     3     static int m = 0;
     4     static int n = 0;
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7           fun(3);
     8           System.out.println();
     9           System.out.println("n="+n);
    10           System.out.println("m="+m);
    11     }
    12 
    13     static void fun(int a) {
    14         int i;
    15         System.out.print(a);
    16         for (i = 0; i < a; i++){
    17             n++;
    18             fun(a - 1);
    19             m++;
    20         }
    21     }
    22 
    23 }

    输出结果为:
    3210102101021010
    n=15
    m=15

    函数执行完n++后,本来还要执行m++,但突然入栈,阻碍了,但出栈时肯定还会接着剩下的执行。n和m最终的值肯定是一样的,但在某一时刻可能出现n>m,因为先入栈后出栈。

    运行流程如下图:

     在每个斜杠处执行n++,在每个反斜杠处执行m++,斜杠和反斜杠正好都是15个

  • 相关阅读:
    超级变态之access查询
    计算机安全病毒问题汇集(转自华军)
    Avast I Love You
    Windows2003 3389端口修改
    希捷 250G 7200.10 8M(串口/5年盒)(买硬盘了~~~)
    DataTable 中Remove方法的使用
    我的主板(p5pl2e)
    冼东妹(为奥运冠军名字作诗)
    李彦宏告诫年轻人:向前看两年
    郭文珺(为奥运冠军名字作诗)
  • 原文地址:https://www.cnblogs.com/hixin/p/4134090.html
Copyright © 2011-2022 走看看