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

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

时间: 2024-10-04 17:06:40

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

一个简单的小例子让你明白c#中的委托-终于懂了!

模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事件委托给多个嘉宾去处理.因此在Host 类定义事件,在Guests类中定义事件的响应方法.通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件.实现过程如下: 代码其实很少下面贴出来所有代码: QuestionArgs.cs view plaincopy to

Spring简单的小例子SpringDemo,用于初略理解什么是Spring以及JavaBean的一些概念

一.开发前的准备 两个开发包spring-framework-3.1.1.RELEASE-with-docs.zip和commons-logging-1.2-bin.zip,将它们解压,然后把Spring开发包下dist目录的所有包和commons-logging包下的commons-logging-1.1.1.jar复制到名为Spring3.1.1的文件夹下.那么Spring开发所需要的包就组织好了. 二.建立项目,导入包 在项目节点上右键,Build Path/ADD Libraries/U

vuex在组件化开发中的简单应用小例子

首先, 介绍一下vuex是个什么东西, 个人理解来说, vuex就是一个状态管理的东西, 它里面有且仅有一个Store仓库, 这个仓库里面存放着一些变量, 为什么要有这么一个变量呢, 用过vue的人肯定都清除, 父子组件之间的通讯传值是个比较麻烦的事情, 特别是, 嵌套组件特别多的时候, 这种情况下, 一级一级地传递下去十分麻烦, 还有就是兄弟组件之间的传值也一样麻烦. 而vuex中的Store这个仓库, 就能够为我们将放在这个仓库中的值, 分发给整个项目下的所有组件, 也就是说是, 不用一级一

C语言:递归小例子几则

递归定义: 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法. 递归条件: (1) 递归就是在过程或函数里调用自身: (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. 利用递归可以使程序简化,减少代码的编写,下面请看例子. 1.取得十进制数的每一位并以字符的形式输出. #include<stdio.h> #include<stdlib.h> void binary_to_ascii(unsigned int value) { int num = v

Asp.net MVC4之 一个简单的小例子

练习: 新建一个mvc项目 要求: 有3个视图  Login Index Details 目的:感受一下MVC与传统WebForm的差异性 WebForm的请求模型 MVC请求模型 传统WebForm与MVC区别 WebForm 实际上请求的是一个页面对象 MVC 不仅请求了一个页面对象,还向服务器请求了具体的业务处理方法 程序结构如下 一,项目模板和视图引擎介绍 项目模板 基本: 一般选择这个  它会自动将一些Jquery库导入进来 Internet应用程序:外网使用的 Intranect应用

1个争用资源的简单线程小例子

main()本身就是一线程,现在在main内部再创建另一个线程, 例子只是简单的在两个线程中打印了一下TID和PID以及获取本身PID,当然两个线程的TID是一样的,PID是不一样的. 这里主要说的是:两个线程一起运行,屏幕上显示的各线程的内容,因为一起争用资源,造成了打印信息内容的重叠. 代码: #include <iostream> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #i

超简单的通过年月得到当月天数,从简单的小例子来解析代码的优化

首先分析问题,通过年月得到当前月份的天数,按照生活中的惯性,就是分析年份,后分析月份,这里我要说不,虽然这样同样可以算出结果,速度上也与先判断月份相差毫微,虽然这个时间短的可以忽略不计,但是作为一个有情怀的程序员,对代码的要求就是要短小精悍,能省就省,我先列出两种分析方式的算法代码,当然这种写法是最笨重的,这里主要是为了突出问题,优化一步步来,我始终强调,先分析问题,只要会写代码的程序员写完立马就会改为方式二的写法,因为在代码量上很直观,一眼就能看的清楚: 先判断年份的写法: public st

我的第一个用Hibernate框架写的小例子

Hibernate框架 今天我来主要讲一下Hibernate框架的配置步骤,在讲之前,我们先了解一下使用框架的优势 1.不再考虑公共问题,框架已经帮我们做好了 2.可以专心于业务逻辑,保证核心业务逻辑的开发质量 3.结构统一,便于学习和维护 4.框架中集成了前人的经验,可以帮助新手写出稳定.性能优良而且结构优美的高质量程序. 我们都知道SSH集成框架指的是基于Struts或Struts2+Spring+Hibernate的技术框架,也就是我们常说的三大框架,使用这个集成框架将使我们应用程序更加健

java入门---简介&amp;简单输出小例子&amp;开发前准备

    Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出.Java分为三个体系: JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版) JavaME(J2ME)(Java 2 Plat