解释循环中的递归调用


2017年11月06日 11:39:56 ​​冰凌其​


  1. #include <iostream>
  2. void fun(int a)
  3. {
  4. int i;

  5. printf("%d ",a);

  6. for(i=0;i<a;i++)
  7. fun(a - 1);
  8. }

  9. int main(){

  10. fun(3);

  11. return 0;
  12. }


这个程序的运行结果是: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))