递归算法
核心三要素:
- 终结点
- 公式
- 算法的走向(走向终结点)
经典案例(猴子吃桃)
/**
目标:递归的经典案例。
猴子吃桃:
猴子第一天摘了若干个桃子,当即吃了一半,觉得好不过瘾,然后又多吃了一个。
第二天又吃了前一天剩下的一半,觉得好不过瘾,然后又多吃了一个。
以后每天都是如此
等到第十天再吃的时候发现只有1个桃子,请问猴子第一天总共摘了多少个桃子。
公式:
f(x+1) = f(x) - f(x) / 2 - 1
2f(x+1) = 2f(x) - f(x) - 2
2f(x+1) = f(x) - 2
f(x) = 2f(x+1)+2
递归的三要素:
(1)公式:f(x) = 2f(x+1)+2
(2)终结点:f(10) = 1
(3)递归的方向:走向了终结点
*/
public class RecursionDemo04 {
public static void main(String[] args) {
System.out.println(f(1));
}
public static int f(int x){
if( x == 10){
return 1 ;
}else{
return 2*f(x+1)+2;
}
}
}
递归实现文件搜索
非规律性递归按照业务流程进行编程
import java.io.File;
import java.io.IOException;
public class Dome {
public static void main(String[] args) {
searchFile(new File("E/Green"),"Everything");
}
public static void searchFile(File dir ,String fileName){
//判断是否存在该路径,是否是文件夹
if (dir.exists()&&dir.isDirectory()) {
File[] files = dir.listFiles();
//判断是否存在一级文件对象
if (files!=null&&files.length>0) {
for (File f : files) {
if (f.isFile()) {
if (f.getName().contains(fileName)) {
System.out.println(f.getAbsolutePath());
try {
//启动它
Runtime r = Runtime.getRuntime();
r.exec(f.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
}else{
searchFile(f,fileName);
}
}
}
}
}
}
非规律性递归算法
/*题目:一个人拥有十元钱,啤酒2元每瓶,两个空瓶子可以兑换一瓶,四个盖子可以兑换一瓶,
* 问:这个人可以和几瓶酒,剩几个瓶子和几个盖子?*/
public class Dome01 {
public static void main(String[] args) {
int money =10;
//十块钱买了五瓶
int beer =money/2;
//剩下的瓶子数是
int lastPingZi = beer;
//剩下的盖子数是
int lastGaiZi = beer;
//总得喝酒数
int num = beer;
while (true){
if(lastGaiZi>=4){
lastGaiZi-=4;
num+=1;
lastGaiZi+=1;
lastPingZi+=1;
}else if(lastPingZi>=2){
lastPingZi-=2;
num+=1;
lastGaiZi+=1;
lastPingZi+=1;
}else if(lastGaiZi<4&&lastPingZi<2){
break;
}
}
System.out.println("剩余瓶子"+lastPingZi);
System.out.println("剩余盖子"+lastGaiZi);
System.out.println("总共喝酒数是"+num);
}
}