目录
递归的认识
什么是方法递归?
递归做为一种算法在程序设计语言中广泛应用。
方法调用自身的形式称为方法递归( recursion)。
递归的形式
直接递归:方法自己调用自己。
间接递归:方法调用其他方法,其他方法又回调方法自己。
方法递归存在的问题?
递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象。所以递归一定要有递归出口
递归的三要素
递归的公式: f(n) = f(n-1) * n;
递归的终结点:f(1)
递归的方向必须走向终结点:
递归的算法
规律化递归
计算1~~n的阶乘
import java.util.Scanner;
/**
* ClassName: jiecheng
* Package: PACKAGE_NAME
* Description:
*
* @Author TYUST-YHB
* @Create 2023/7/9 16:42
* @Version 1.0
*/
public class jiecheng {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("input n:");
System.out.println(diguijiecheng(scanner.nextInt()));
}
public static long diguijiecheng(int n){
if (n==0) return 1;
else return diguijiecheng(n-1)*n;
}
}
猴子吃桃问题
题目:猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个 第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个 以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个 等到第10天的时候发现桃子只有1个了。 需求:请问猴子第一天摘了多少个桃子?
这里的是一道填空题,是10天后还有一个桃子,代码写成输入n天还有一个桃子,求第1天摘了多少个
函数:假设猴子前一天桃子数目是y,则y等于今天桃子个数加1再乘二,今天的桃子个数也就是(y-2)/2,所以可以得到递归公式
public class Monkey {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("input n:");
System.out.println(Dayone(scanner.nextInt()));
}
private static int Dayone(int n){
if (n==1) return 1;
else return Dayone(n-1)*2+2;
}
}
非规律化递归
文件搜索
需求:文件搜索、从D:盘中,搜索出某个文件名称并输出绝对路径。
分析: 先定位出的应该是一级文件对象
遍历全部一级文件对象,判断是否是文件
如果是文件,判断是否是自己想要的
如果是文件夹,需要继续递归进去重复上述过程
需求分析:搜索出D:盘下的javaCode文件夹里的file.docx文件,并显示其绝对路径("D:\JavaCode\file.docx")
package digui;
import java.io.File;
/**
* ClassName: fileDemo
* Package: digui
* Description:
*
* @Author TYUST-YHB
* @Create 2023/7/9 17:47
* @Version 1.0
*/
public class fileDemo {
public static void main(String[] args) {
searchFile(new File("D:/"),"file.docx");
}
/**
* 搜索目录下的全部文件,打印文件名称
* @param dir:文件夹
* @param filename:文件名称
*/
private static void searchFile(File dir,String filename){
if (dir !=null&&dir.isDirectory()){
//开始查找
File[] files = dir.listFiles();
if (files!=null&&files.length>0){
for (File file : files) {
if (file.isFile()){
if (file.getName().contains(filename)){
System.out.println("找到了,文件的路径是" + file.getAbsolutePath());
}
}else if (file.isDirectory()){
searchFile(file,filename);
}
}
}
}else System.out.println("error,当前搜索的位置不是文件夹");
}
}
运行结果
啤酒问题
需求: 啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶, 请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。
答案: 15瓶 3盖子 1瓶子
public class pijiu {
static int jiu=0;//静态的成员变量存储买到的酒的数量
static int gaizi=0;//静态变量储存瓶子数
static int pingzi=0;//静态变量储存盖子数
public static void main(String[] args) {
buy(10);
System.out.println("一共喝了" + jiu + "瓶酒" + "剩余" + gaizi + "个盖子" + "剩余" + pingzi + "个瓶子");
}
static void buy(int money){
//买酒
int maidejiu=money/2;
jiu+=maidejiu;
gaizi+=maidejiu;
pingzi+=maidejiu;
//盖子瓶子换钱
int allmoney=0;
while (gaizi-4>-1){
allmoney+=2;
gaizi-=4;
}
while (pingzi-2>-1){
allmoney+=2;
pingzi-=2;
}
if (allmoney!=0) buy(allmoney);
}
}