博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个强悍的极简单递归小例子帮你从程序执行的角度理解递归
阅读量:4563 次
发布时间:2019-06-08

本文共 1143 字,大约阅读时间需要 3 分钟。

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

 

 

转载于:https://www.cnblogs.com/tanfd/p/6138872.html

你可能感兴趣的文章
JavaScript之函数作用域
查看>>
仿迅雷播放器教程 -- C++界面制作方法的对比 (9)
查看>>
近期计划
查看>>
解决DFS Locations从Eclipse的Navigator中消失的问题
查看>>
Vue搭建项目
查看>>
java学习笔记《一》网络编程基础
查看>>
设计模式
查看>>
mysqld_safe A mysqld process already exists
查看>>
六年测试之精华分享:产品质量应从哪些方面提高
查看>>
文件处理
查看>>
for循环
查看>>
【转】Android手机客户端关于二维码扫描的源码--不错
查看>>
【转】Java 多线程(四) 多线程访问成员变量与局部变量
查看>>
【转】gcc warning: braces around scalar initializer (标量初始化的括号)
查看>>
C/C++内存泄漏及检测(vs2005平台)【转】
查看>>
SpringBoot中遇到的问题---【Whitelabel Error Page 404 spring boot解决方法】
查看>>
python之路--模块--景丽洋
查看>>
postfix队列管理
查看>>
编译安装nginx
查看>>
操作系统的硬件环境
查看>>