个人简介
- 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
- 欢迎点赞+收藏+留言💜
- 那些看似不起波澜的日复一日,会在某天让你看到坚持的意义。🧡
方法递归:方法直接调用自己或者间接调用自己的形式称为方法递归。
使用递归求阶乘:
import java.util.Scanner;
//求n的阶乘
public class Demo_01 {
public static void main(String[] args) {
System.out.println("请输入n值:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(j(n));
}
public static int j(int n){
if(n==1){
return 1;
}else {
return j(n-1)*n;
}
}
}
方法递归在解决某些问题中会很方便,但是如果没有控制好会出现递归死循环,导致栈内存溢出现象。
递归解决问题的思路:把复杂的问题转化为一个与原问题相似的小问题来解决。
递归三要素:
1.先找出递归的公式
2.找出递归的终结点,防止出现死循环
3.递归的方向必须走向终结点
案例:
分析:第10天只剩1个,那么第九天桃子个数:4; 第八天桃子个数:10;第七天桃子个数:22……
1.先找出递归公式: f(n)=2*f(n+1)+2
2.找出递归的终结点,防止死循环;终结点就是当n==10时候,返回1
3.保证递归的方向必须走向终结点,就是让n走向可以返回具体值的方向。
/**
* @author hanhan
* date 2022/4/9 21:49
*努力已经来不及了,你得拼命
*/
public class Demo_03 {
public static void main(String[] args) {
System.out.println(s(1));
}
public static int s(int n){
if(n==10){
return 1;
}else{
return 2*s(n+1)+2;
}
}
}
非规律化递归问题:从文件夹目录下查找具体文件并且输出绝对路径。
思路:
1.先定位出一级文件对象
2.遍历全部一级文件对象,判断是否是文件
3.如果是文件,判断是否为自己想要
4.如果是文件夹,需要继续递归进去重复上述过程
import java.io.File;
/**
* @author hanhan
* date 2022/4/10 16:14
* 努力已经来不及了,你得拼命
*/
public class Demo_04 {
public static void main(String[] args) {
File f=new File("C:/");
searchFile(f,"腾讯QQ");
}
public static void searchFile(File file,String name) {
//判断传入的参数是否为文件夹并且不为空,因为我们是在非空文件夹下寻找
if (file.isDirectory() && file != null) {
File[] file1 = file.listFiles();
//获取到一级目录以后要检验是否为null和空数组;因为当当文件无权限访问时候会返回null,没有一级文件对象是返回[]
if (file1 != null && file1.length > 0) {
for (File f : file1) {
if (f.isFile()) {
if (f.getName().contains(name)) {
System.out.println("查找成功。路径:" + f.getAbsoluteFile());
}
} else {
searchFile(f, name);
}
}
}
} else {
System.out.println("抱歉,您输入的文件非文件夹或为空文件夹,无法查找!");
}
}
}
案例:
代码演示:
/**
* @author hanhan
* date 2022/4/10 18:55
* 努力已经来不及了,你得拼命
*/
public class Demo_08 {
static int totalNumber;//记录总数量
static int lastCoverNumber;//记录每次剩余的瓶子个数
static int lastBottleNumber;//记录每次剩余的瓶盖个数
public static void main(String[] args) {
buy(10);
System.out.println("可以买"+totalNumber+"瓶啤酒");
System.out.println("剩余瓶盖"+lastCoverNumber);
System.out.println("剩余瓶子数:"+lastBottleNumber);
}
public static void buy(int money){
int number=money/2;
totalNumber+=number;
int coverNumber=number+lastCoverNumber;
int bottleNumber=number+lastBottleNumber;
int allMoney=0;
if(coverNumber>=4){
allMoney+=(coverNumber/4)*2;
}
lastCoverNumber=coverNumber%4;
if(bottleNumber>=2){
allMoney+=(bottleNumber/2)*2;
}
lastBottleNumber=bottleNumber%2;
if(allMoney>=2){
buy(allMoney);
}
}
}