初始类
方法内调用方法自身
public class RecursionDemo1 {
public static void main(String[] args) {
System.out.println("sum:1***5");
System.out.println(recur(5));
System.out.println("sum:1+++5");
System.out.println(recur1(5));
}
private static int recur1(int i) {
if (i == 1) {
return 1;
} else {
return recur1(i - 1) + i;
}
}
private static int recur(int i) {
if (i == 1) {
return 1;
} else {
return recur(i - 1) * i;
}
}
}
猴子吃桃案例
public class RecursionDemo2 {
public static void main(String[] args) {
/**
* 猴子吃桃问题,每天吃现存的一半,加一颗,第十天只剩一颗,求第一天共多少
* f(2) = f(1)/2 -1; 第一天吃一半,再多吃一个,就是第二天的存量
* f(n) = f(n-1)/2 - 1; 2f(n) = f(n-1) -2; 这个方向向第二天,不向第一天,所以把括号里的变量加一
* 2f(n+1) = f(n) -2; f(n) = 2f(n+1) +2; 这样,方向就能从第一天递到第十天,从第十天归回
*/
System.out.println("There are total "+recur(1)+" peach at first day.");
System.out.println(recur(2));
System.out.println(recur(3));
System.out.println(recur(4));
System.out.println(recur(5));
System.out.println(recur(6));
System.out.println(recur(7));
System.out.println(recur(8));
System.out.println(recur(9));
}
private static int recur(int i) {
if (i == 10) {
return 1;
} else {
return recur(i + 1)*2 + 2 ;
}
}
}
查找指定对象,此处一wmplayer为例,有bug没解决,看思想
import java.io.File;
import java.io.IOException;
public class RecursionDemo3 {
/**
* search an exe file
* C:\Program Files\Windows Media Player\wmplayer.exe
*/
public static void main(String[] args) {
searchFile(new File("C:/"),"wmplayer.exe");
}
private static void searchFile(File dir ,String originName) {
if (dir != null && dir.isDirectory()){
/**此处是看C盘本身是否存在,且是不是一个文件夹*/
File[] files = dir.listFiles();
/**跟着判断当前目录下有一极文件对象,且可以拿到files中
* 因为有的时候设置了权限的拿不到,有一级对象也会length小于0*/
if (files != null && files.length >0){
for (File file : files) {
if (file.isFile()){
if (file.getName().contains(originName)){
System.out.println("Find out Bingo! It's at: "+file.getAbsolutePath());
if (file.getName().equals(originName)){
Runtime r = Runtime.getRuntime();
try {
r.exec(file.getAbsolutePath());
/**实践证明,wmplayer打开了,但会报IO异常,因为下面无论是break或return都无法终止递归查找
* 之后找到的wmplayer文件无法runtime*/
break;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}else {
searchFile(file,originName);
}
}
}
}else {
System.out.println("Sorry, this path is not a folder.");
}
}
}
买啤酒案例
public class RecursionDemo4 {
/**
* 买酒案例 先定义静态变量几个
* 两元一瓶
* 两个瓶子凑齐可以兑换一罐,有两个瓶子,等于钱加两元,未满不算
* 四个盖子可以兑换一瓶,有四个盖子等于钱加两元,未满不算
*/
public static int totalBuyNum;
public static int lastBottleNum;
public static int lastCoverNum;
public static void main(String[] args) {
buyBeer(10);
System.out.println(totalBuyNum);
System.out.println(lastBottleNum);
System.out.println(lastCoverNum);
}
private static void buyBeer(int money) {
int buyNum = money/2;
totalBuyNum += buyNum;
int bottleNum = lastBottleNum + buyNum;
int coverNUm = lastCoverNum + buyNum;
int moneyInHand = 0;
if (bottleNum >= 2){
moneyInHand += (bottleNum / 2) * 2;
}
lastBottleNum = bottleNum % 2;
if (coverNUm >= 4){
moneyInHand += (coverNUm / 4) * 2;
}
lastCoverNum = coverNUm % 4;
if (moneyInHand >= 2){
buyBeer(moneyInHand);
}
}
}