java递归基础入门.docx
《java递归基础入门.docx》由会员分享,可在线阅读,更多相关《java递归基础入门.docx(16页珍藏版)》请在冰豆网上搜索。
java递归基础入门
1:
递归(理解)
(1)方法定义中调用方法本身的现象
举例:
老和尚给小和尚讲故事,我们学编程
(2)递归的注意事项;
A:
要有出口,否则就是死递归
B:
次数不能过多,否则内存溢出
C:
构造方法不能递归使用
(3)递归的案例:
A:
递归求阶乘
B:
兔子问题
C:
递归输出指定目录下所有指定后缀名的文件绝对路径
D:
递归删除带内容的目录(小心使用)
2:
IO流(掌握)
(1)IO用于在设备间进行数据传输的操作
(2)分类:
A:
流向
输入流读取数据
输出流写出数据
B:
数据类型
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
注意:
a:
如果我们没有明确说明按照什么分,默认按照数据类型分。
b:
除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。
(3)FileOutputStream写出数据
A:
操作步骤
a:
创建字节输出流对象
b:
调用write()方法
c:
释放资源
B:
代码体现:
FileOutputStreamfos=newFileOutputStream("fos.txt");
fos.write("hello".getBytes());
fos.close();
C:
要注意的问题?
a:
创建字节输出流对象做了几件事情?
b:
为什么要close()?
c:
如何实现数据的换行?
d:
如何实现数据的追加写入?
(4)FileInputStream读取数据
A:
操作步骤
a:
创建字节输入流对象
b:
调用read()方法
c:
释放资源
B:
代码体现:
FileInputStreamfis=newFileInputStream("fos.txt");
//方式1
intby=0;
while((by=fis.read())!
=-1){
System.out.print((char)by);
}
//方式2
byte[]bys=newbyte[1024];
intlen=0;
while((len=fis.read(bys))!
=-1){
System.out.print(newString(bys,0,len));
}
fis.close();
(5)案例:
2种实现
A:
复制文本文件
B:
复制图片
C:
复制视频
(6)字节缓冲区流
A:
BufferedOutputStream
B:
BufferedInputStream
(7)案例:
4种实现
A:
复制文本文件
B:
复制图片
C:
复制视频
3:
自学字符流
IO流分类
字节流:
InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
字符流:
Reader
FileReader
BufferedReader
Writer
FileWriter
BufferedWriter
FileInputStream读取数据的两种方法
IO流的分类
递归解决问题的思路
递归求阶乘
1递归
packagecn.itcast_01;
/*
*递归:
方法定义中调用方法本身的现象
*
*方法的嵌套调用,这不是递归。
*Math.max(Math.max(a,b),c);
*
*publicvoidshow(intn){
*if(n<=0){
*System.exit(0);
*}
*System.out.println(n);
*show(--n);
*}
*
*注意事项:
*A:
递归一定要有出口,否则就是死递归
*B:
递归的次数不能太多,否则就内存溢出
*C:
构造方法不能递归使用
*
*举例:
*A:
从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
*从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
*从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
*从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是:
*...
*庙挂了,或者山崩了
*B:
学编程--高薪就业--挣钱--娶媳妇--生娃娃--放羊--挣学费
*学编程--高薪就业--挣钱--娶媳妇--生娃娃--放羊--挣学费
*学编程--高薪就业--挣钱--娶媳妇--生娃娃--放羊--挣学费
*学编程--高薪就业--挣钱--娶媳妇--生娃娃--放羊--挣学费
*...
*娶不到媳妇或者生不了娃娃
*/
publicclassDiGuiDemo{
//publicDiGuiDemo(){
//DiGuiDemo();
//}
}
2求5的阶乘
packagecn.itcast_02;
/*
*需求:
请用代码实现求5的阶乘。
*下面的知识要知道:
*5!
=1*2*3*4*5
*5!
=5*4!
*
*有几种方案实现呢?
*A:
循环实现
*B:
递归实现
*a:
做递归要写一个方法
*b:
出口条件
*c:
规律
*/
publicclassDiGuiDemo{
publicstaticvoidmain(String[]args){
intjc=1;
for(intx=2;x<=5;x++){
jc*=x;
}
System.out.println("5的阶乘是:
"+jc);
System.out.println("5的阶乘是:
"+jieCheng(5));
}
/*
*做递归要写一个方法:
*返回值类型:
int
*参数列表:
intn
*出口条件:
*if(n==1){return1;}
*规律:
*if(n!
=1){returnn*方法名(n-1);}
*/
publicstaticintjieCheng(intn){
if(n==1){
return1;
}else{
returnn*jieCheng(n-1);
}
}
}
3兔子问题
packagecn.itcast_02;
/*
*有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
*分析:
我们要想办法找规律
*兔子对数
*第一个月:
1
*第二个月:
1
*第三个月:
2
*第四个月:
3
*第五个月:
5
*第六个月:
8
*...
*
*由此可见兔子对象的数据是:
*1,1,2,3,5,8...
*规则:
*A:
从第三项开始,每一项是前两项之和
*B:
而且说明前两项是已知的
*
*如何实现这个程序呢?
*A:
数组实现
*B:
变量的变化实现
*C:
递归实现
*
*假如相邻的两个月的兔子对数是a,b
*第一个相邻的数据:
a=1,b=1
*第二个相邻的数据:
a=1,b=2
*第三个相邻的数据:
a=2,b=3
*第四个相邻的数据:
a=3,b=5
*看到了:
下一次的a是以前的b,下一次是以前的a+b
*/
publicclassDiGuiDemo2{
publicstaticvoidmain(String[]args){
//定义一个数组
int[]arr=newint[20];
arr[0]=1;
arr[1]=1;
//arr[2]=arr[0]+arr[1];
//arr[3]=arr[1]+arr[2];
//...
for(intx=2;xarr[x]=arr[x-2]+arr[x-1];
}
System.out.println(arr[19]);//6765
System.out.println("----------------");
inta=1;
intb=1;
for(intx=0;x<18;x++){
//临时变量存储上一次的a
inttemp=a;
a=b;
b=temp+b;
}
System.out.println(b);
System.out.println("----------------");
System.out.println(fib(20));
}
/*
*方法:
返回值类型:
int参数列表:
intn出口条件:
第一个月是1,第二个月是1规律:
从第三个月开始,每一个月是前两个月之和
*/
publicstaticintfib(intn){
if(n==1||n==2){
return1;
}else{
returnfib(n-1)+fib(n-2);
}
}
}
4递归删除带内容的目录
packagecn.itcast_03;
importjava.io.File;
/*
*需求:
递归删除带内容的目录
*
*目录我已经给定:
demo
*
*分析:
*A:
封装目录
*B:
获取该目录下的所有文件或者文件夹的File数组
*C:
遍历该File数组,得到每一个File对象
*D:
判断该File对象是否是文件夹
*是:
回到B
*否:
就删除
*/
publicclassFileDeleteDemo{
publicstaticvoidmain(String[]args){
//封装目录
FilesrcFolder=newFile("demo");
//递归实现
deleteFolder(srcFolder);
}
privatestaticvoiddeleteFolder(FilesrcFolder){
//获取该目录下的所有文件或者文件夹的File数组
File[]fileArray=srcFolder.listFiles();
if(fileArray!
=null){
//遍历该File数组,得到每一个File对象
for(Filefile:
fileArray){
//判断该File对象是否是文件夹
if(file.isDirectory()){
deleteFolder(file);
}else{
System.out.println(file.getName()+"---"+file.delete());
}
}
System.out
.println(srcFolder.getName()+"---"+srcFolder.delete());
}
}
}
5绝对路径
packagecn.itcast_03;
importjava.io.File;
/*
*需求:
请大家把E:
\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。
*
*分析:
*A:
封装目录
*B:
获取该目录下所有的文件或者文件夹的File数组
*C:
遍历该File数组,得到每一个File对象
*D:
判断该File对象是否是文件夹
*是:
回到B
*否:
继续判断是否以.java结尾
*是:
就输出该文件的绝对路径
*否:
不搭理它
*/
publicclassFilePathDemo{
publicstaticvoidmain(String[]args){
//封装目录
FilesrcFolder=newFile("E:
\\JavaSE");
//递归功能实现
getAllJavaFilePaths(srcFolder);
}
privatestaticvoidgetAllJavaFilePaths(FilesrcFolder){
//获取该目录下所有的文件或者文件夹的File数组
File[]fileArray=srcFolder.listFiles();
//遍历该File数组,得到每一个File对象
for(Filefile:
fileArray){
//判断该File对象是否是文件夹
if(file.isDirectory()){
getAllJavaFilePaths(file);
}else{
//继续判断是否以.java结尾
if(file.getName().endsWith(".java")){
//就输出该文件的绝对路径
System.out.println(file.getAbsolutePath());
}
}
}
}
}