递归详解(一)
2014-12-01 01:35
148 查看
public class Digui { public static void main(String[] args) { // TODO Auto-generated method stub fun(3); } static void fun(int a) { int i; System.out.print(a); for (i = 0; i < a; i++) fun(a - 1); } }
输出结果: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
进一步的,将函数改为:
public class Digui { static int m = 0; static int n = 0; public static void main(String[] args) { // TODO Auto-generated method stub fun(3); System.out.println(); System.out.println("n="+n); System.out.println("m="+m); } static void fun(int a) { int i; System.out.print(a); for (i = 0; i < a; i++){ n++; fun(a - 1); m++; } } }
输出结果为:
3210102101021010
n=15
m=15
函数执行完n++后,本来还要执行m++,但突然入栈,阻碍了,但出栈时肯定还会接着剩下的执行。n和m最终的值肯定是一样的,但在某一时刻可能出现n>m,因为先入栈后出栈。
运行流程如下图:
在每个斜杠处执行n++,在每个反斜杠处执行m++,斜杠和反斜杠正好都是15个
相关文章推荐
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)
- 二叉树的前序递归建立的详解
- 【转】SQL:详解递归CTE,非递归CTE用法
- IO流(二)之File,递归,Properties详解
- 再次详解递归
- 提升JavaScript递归效率:Memoization(避免重复运算)技术详解
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (2)
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (2)
- 汉诺塔问题详解 (递归)
- 博彦科技笔试题目之递归调用详解
- 汉诺塔的递归详解
- 创新工厂面试题详解:共打了多少鱼 -- 正解 递归求解法
- 函数递归调用详解
- C#递归的应用实例详解
- TreeView递归添加节点详解
- PHP+JS无限级可伸缩菜单详解(递归方法)
- ACM详解(4)——递归
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)
- 递归详解
- JavaSE第八十八讲:递归详解以及递归在阶乘与斐波那契数列的使用