- 1 public class test {
- 2 public static void main(String[] args) {
- 3 swap(3);
- 4
- }
- 5 public static int i = 1; //全局变量
- 6 public static void swap(int a) { //局部变量
- 7
- if (a > 0) {
- 8 a--;
- 9 System.out.println("第" + i + "层:");
- 10 System.out.println("a-1: " + a);
- 11 i++;
- 12
- }
- 13
- else {
- 14 System.out.println("---华丽丽的分割线---");
- 15
- return;
- 16
- }
- 17 swap(a);
- 18 i--;
- 19 System.out.println("第" + i + "层:");
- 20 System.out.println("a: " + a);
- 21
- }
- 22
- }
程序输出:
第 1 层:
a-1: 2
第 2 层:
a-1: 1
第 3 层:
a-1: 0
--- 华丽丽的分割线 ---
第 3 层:
a: 0
第 2 层:
a: 1
第 1 层:
a: 2
程序已经贴出,实现的功能很简单,就是递归把一个数 a 减一,直到 a==0。
这里面要注意的点:
(1)就是程序中全局变量 i,和局部变量 a 的不同。全局变量是同一个值,贯穿递归各层始终,每一层都对它进行操作。但是局部变量是,每一层留有自己的拷贝值,传递到下一层的是上层的拷贝值,当一层结束返回时,这层局部变量会从栈中弹出,销毁。所以我们在设计递归程序时千万不要用局部变量的返回来得到下一层操作对局部变量造成的改变,因为返不回来。详细见下面图解。
(2)在 15 行的 return; 这句代码是必须的,不能默认程序不符合递归条件了,会自己返回。如果在这里不写这句话,当 a==0 时,程序会跳过 7~12 行,直接执行 17 行,反复递归,造成栈溢出。
(3)程序返回到上一层时会继续执行进入到递归时的下一层继续执行,在本程序中,return; 执行完之后(最后一次 return; 除外),会紧接着执行第 18 行 i--;
下面是程序执行时的详细过程示意图:
程序从箭头 1 开始执行,按照箭头 1 到 8 的顺序依次执行代码。每次都在 swap(a); 处进入下一层,每次由下一层返回时接着执行 i--; 这一行代码。
重点就在箭头 2 和 6 处的两个注释。
来源: http://www.bubuko.com/infodetail-1862227.html