一个强悍的极简单递归小例子帮你从程序执行的角度理解递归

 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处的两个注释。

 

 

posted @ 2016-12-06 19:31  轩铭  阅读(999)  评论(0编辑  收藏  举报