学习日记(十)java递归

递归:一个过程(方法)直接或间接的调用自己本身,这个过程叫做递归。

例如这样一个小程序:

package demo;

public class Demo {

public static void main(String[] args) {

Demo5 demo=new Demo5();

int num=demo.test(3);//int num=demo.test(4);int num=demo.test(5);

System.out.println(num);

}

}

class Demo5 {

public int test(int a){

int result;

if(a==1){

return 1;

//调用test方法本身,实现递归

result=test(a-1)*a;

return result;

}

}

这个程序中,类Demo5中的test方法里边又调用了test方法本身,这就是递归。在main方法中运行的时候,当参数是3时,输出的num结果是6;参数是4时,结果是24;参数是5时,结果是120.

这些结果得来的过程是这样的:

1.当参数是3时,也就是int num=demo.test(3);这个时候会进入到test方法中,首先经过if判断a!=1,因此直接走下一步,也就是result=test(3-1)*3,即result=test(2)*3;

因为这里又有test方法,参数是2,因此会在这里再次调用test方法,下一步再if判断,依旧是a!=1,则test(2)的结果就是test(1)*2;

那么上一步中result=test(2)*3中的test(2)就要进行替换,结果是result=test(1)*2*3;

走到这一步以后,程序并没有结束,因为这里边依旧还有test方法,那么会再次调用test,再次if判断,这时候a==1,则return 1;也就是test(1)=1;

那么,上边的结果将会再次变化,即:num=result=test(1)*2*3=1*2*3=6。这就是当参数是3的时候,结果是6的递归运行过程。

2.同样的,当参数是4的时候,也就是int num=demo.test(4);首先a!=1,那么运行到下一步就是result=test(3)*4;

紧接着,test(3)之后的运行步骤就和参数是3的时候一样,那么最终的结果就是:num=result=test(3)*4=1*2*3*4=24;

3.那么当参数是5的时候,按照上边的步骤,也就是将会在最开始的时候编程test(4)*5,那么结果就是24*5=120.

再例如下边的求累加和的例子:

package demo;

public class Test1 {

public static void main(String[] args) {

Demo11 demo=new Demo11();

int num=demo.test(3);//int num=demo.test(4);int num=demo.test(3)

System.out.println(num);

}

}

class Demo11{

public int test(int n){

int sum;

if(n>0){

//调用test方法本身实现递归

sum=n+test(n-1);

return sum;

}else{

return 0;

}

}

}

这个例子是求比我们指定的正整数小的所有正整数的和,在Demo11类中的test方法中又调用了test方法本身,这里用到了递归。

在这个例子中,参数是3的时候,结果是6;参数是4的时候,结果是10;参数是5的时候,结果是15。它的具体实现过程是这样的:

1.当参数是3的时候,也就是n=3,首先if判断n>0,那么sum=3+test(2);紧接着test(2)再次if判断n>0,结果是2+test(1);那么整个sum结果就会变成sum=3+test(2)=3+2+test(1);

再然后,继续test(1),结果是1+test(0);再然后继续test(0),n=0,return 0,结果是0;那么整个sum的结果就是sum=3+2+1+0=6。

2.当参数是4的时候,n=4,同样的,首先是sum=4+test(3),然后就是重复test(3)的步骤,结果是sum=4+test(3)=4+3+2+1+0=10。

3.再到参数是5的时候,n=5,那么一开始if之后就是sum=5+test(4);然后sum=5+4+3+2+1+0=15。

我们以前读书的时候学过从1加到100的累加和,结果是5050,那么在这里如果把参数设为100,结果也是5050,是完全符合的,而计算的步骤也和上边的一样。

递归的过程实际上可以看成是不断的调用不断的替换的过程,有人认为递归的优点是:采用递归算法比采用迭代算法要更加清晰和简单。

在编写递归的时候,必须要使用if在递归调用不执行的时候强制方法返回,否则程序将永远不返回。

时间: 2024-07-31 12:38:24

学习日记(十)java递归的相关文章

Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量. final的特点 final修饰类不可以被继承,但是可以继承其他类. class Yy {} final clas

Python学习日记(十四) 正则表达式和re模块

正则表达式: 它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量 字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一个大写字母或小写字母等 下面测试以该网站为例http://tool.chinaz.com/regex/ #正则表达式 匹配字符串 匹配结果 #[0-9] 9 9 [0-9]的写法就相当于在用[0123456789] #[0123456789] 0 0 #[a-z] 1 None 这里只匹配小写字符a

Python学习日记(十九) 模块导入

模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc(): print('这个函数被调用!') 然后我们在command模块中执行下列代码: import command #这个py文件被调用! 我们如果在这段程序中反复执行多次这一段代码,这一个文件结果也只会被导入一次 import command #这个py文件被调用! import command import command import command

Java学习日记(一)基础

标识符: 由26个英文字母大小写,数字:0-9 符号:_ $ 组成 定义合法标识符规则: 1.数字不可以开头. 2.不可以使用关键字. 3.Java中严格区分大小写. Java中的注释格式: 单行注释: 格式: //注释文字 多行注释: 格式: /* 注释文字*/ 文档注释: 格式:/** 注释文字 */ 常量: 常量表示不能改变的数值. java中常量的分类: 1.整数常量.所有整数 2.小数常量.所有小数 3.布尔型常量.较为特有,只有两个数值.true 和false. 4.字符常量.将一个

java学习日记

我自己是学前端的,个人认为,如果一个前端连一个后台语言都不曾了解过,在工作中可能会和后台掐架,抱着这种心态来自己学学java,在这几天看过的书和视频来看,很多java当中的语法和js有很多相似之处,就比如说关键字:if,for之类的,可以说是编程语言当中最常见而且最常使用,使用方式也是相同的几个关键字了.经过两天的学习,了解了java和js的不同之处: 取值的方式不同,在js中找到input节点.value就能轻松取值,但是在java中,要取值首先要导入一个包"Scanner",创建&

java学习日记第一天

java 学习日记 第一天 java学习准备工作 首先环境配置:一个是jdk安装,另一个编译工具 eclipse ,安装下载教程网上很多 找了一个照着做就行 : 上述步骤完成,我们就可以打开eclipse进行我们第一个程序的编写啦当然是编写我们熟悉的helloWorld创建一个Java Perfect 目前好像基本都习惯用工程管理我们就建一个java工程然后点开工程在src右键new一个class,不用问这是啥这是啥,先把程序跑起来,慢慢就懂了我们在{}写我们的程序,这就好比helloworld

201671010140. 2016-2017-2 《Java程序设计》java学习第十六周

java学习第十六周         本周对十三章:"部署java应用程序"进行了课堂学习,在老师思路牵引下,对这一章知识进行学习,对实例程序运行和注释,对比课前对书本上知识的浅显预习,半知半解,课堂学习后,对这部分知识的理解也更加深入,尤其是在JAR文件这部分,感觉掌握的不错,对Java程序为何要打包成JAR文件,如何去做都有了进一步学习,认知,之前并不理解如何使用jar程序制作JAR文件,在课堂上同学的演示下,也理解了这部分知识.在对JAR文件中的包的密封,属性映射等方面的知识掌握

Java学习日记 num1

学习内容:JAVA语言的特点:path以及classpath环境变量区别:Java开发流程: 一.Java概述语言概述 1 Java概述语言概述 (1)是SUN(Stanford University Network,斯坦福 大学网络公司)1995年推出的一门高级编程语言 ? (2)是一种面向Internet的编程语言. ?   (3)随着Java技术在web方面的不断成熟,已经成 为Web应用程序的首选开发语言. ?  (4)是简单易学,完全面向对象,安全可靠,与平 台无关的编程语言. 2 J

java学习日记-0722班程*:告别国企的舒坦日子,选择尚硅谷

放着安逸的国企工作没做,毅然的选择了辞职,然后来到了帝都,来到了尚硅谷参加北京JAVA培训学习.今年本命年的我,发现自己还是过得那么浑浑噩噩,在国企的日子很爽,压力不大,收入不错,可是感觉自己没有大好的发展前景,年经的时候是奋斗的时候,唯有这样人到中年才能有所收获.带着这个想法,然后自己有在大学学习C语言的基础,所以想找准人生的方向拼一把,就来到了尚硅谷参加IT培训.                时至今日,培训已有一月多了.来到这里,感觉很亲切,这里的环境,这里的班主任,这里的讲师都是很给力.

学习日记-----各种问题

用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答: 从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:是系统的UI部分,负责使用者与整个系统的交互.  优点:  分工明确,条理清晰,易于调试,而且具有可扩展性. 缺点:  增加成本. 分层式结构究竟其优势何在? 1.开发人员可以只关注整个结构中的其中某一