zoukankan      html  css  js  c++  java
  • 解释循环中的递归调用

    解释循环中的递归调用

    https://blog.csdn.net/xiao1_1bing/article/details/78456103

    1.  
      #include <iostream>
    2.  
      void fun(int a)
    3.  
      {
    4.  
      int i;
    5.  
       
    6.  
      printf("%d ",a);
    7.  
       
    8.  
      for(i=0;i<a;i++)
    9.  
      fun(a - 1);
    10.  
      }
    11.  
       
    12.  
      int main(){
    13.  
       
    14.  
      fun(3);
    15.  
       
    16.  
      return 0;
    17.  
      }

    这个程序的运行结果是:3 2 1 0 1 0 2 1 0 1 0 2 1 0 1 0

    不是太好理解,想理解的话,静下心看下去。。。

    第一种:

    这么讲吧:
    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,2,1,0

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

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

    第二种:

    理解了第一种,第二种就容易理解了

    这个题目还可以这样理解
    fun(0)的输出:0
    fun(1)的输出:1fun(0)->10(就是输出1后,循环一次执行fun(0))
    fun(2)的输出:2fun(1)fun(1)->21010(就是输出2后,循环两次执行fun(1))
    fun(3)的输出:3fun(2)fun(2)fun(2)->3210102101021010(就是输出3后,循环执行了3次fun(2))

  • 相关阅读:
    使用URLEncoder、URLDecoder进行URL参数的转码与解码
    js中的连等==和全等===
    sass用法
    sass/scss 和 less的区别
    JSON与localStorage的爱恨情仇
    ionic2
    雪碧图
    JavaScript交换两个变量值的七种解决方案
    JavaScript中的[]和{}
    为什么 ++[[]][+[]]+[+[]] = 10?
  • 原文地址:https://www.cnblogs.com/handsome1013/p/10553508.html
Copyright © 2011-2022 走看看