递归算法所体现的“重复”一般有三个要求:
经典案例:
1.阶乘的案例(求5!?)
publicclass Recursion {
/**
* 降阶
* 5!=5*4!
* 4!=4*3!
* 3!=3*2!
* 2!=2*1!
* 1!=1;
*/
staticint jieCheng(int n){ //假设n=1
if(n<=1){
return 1;
}else{
return n*jieCheng(n-1); //假设2
}
}
publicstaticvoid main(String[] args) {
System.out.println(jieCheng(3));
}
}
2.斐波那契数列
publicclass RecursionDemo1 {
/**
* f(1)=0; 1
* f(2)=1;
* f(3)=1;-f(2)+f(1)
* f(4)=2;f(3)+f(2)
* f(n)=; f(n-1)+f(n-2);
*
*/
staticint feiNa(int n){
if(n==1){
return 0;
}elseif(n==2){
return 1;
}else{
returnfeiNa(n-1)+feiNa(n-2);
}
}
publicstaticvoid main(String[] args) {
System.out.println(feiNa(4));
}
}
3.斐波那契数列引发的兔子繁殖问题分析及实现
兔子繁殖的问题:一般而言,兔子在出生两个月后, 就有繁殖能力, 一对兔子每个月能生出一对小兔子来 。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
分析:
| 经过月数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 幼仔对数 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 |
| 成兔对数 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
| 总体对数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 | 233 |
import java.sql.Date;
publicclass RecursionDemo2 {
/**
* 幼崽 n代表月数
*
* @param n
* @return
*/
staticint feiNa(int n) { // 月数
if (n == 0) {
return 1;
} elseif (n == 1) {
return 0;
} elseif (n == 2) {
return 1;
} elseif (n == 3) {
return 1;
} else {
returnfeiNa(n - 1) +feiNa(n -2);
}
}
/**
* 成崽 n代表月数
*
* @param n
* @return
*/
staticint feiNas(int n) { // 月数
if (n == 0) {
return 0;
} elseif (n == 1) {
return 1;
} else {
returnfeiNas(n - 1) +feiNas(n- 2);
}
}
/**
* 总数n代表月数
*
* @param n
* @return
*/
staticint feiNass(int n) { // 月数
if (n == 0) {
return 1;
} elseif (n == 1) {
return 1;
} else {
returnfeiNass(n - 1) +feiNass(n- 2);
}
}
publicstaticvoid main(String[] args) {
System.out.println(feiNa(12));
System.out.println(feiNas(12));
System.out.println(feiNass(12));
System.out.println(newDate(2,11, 1));
}
3汉诺塔问题
package test;
import java.util.*;
import javax.swing.text.html.HTMLDocument.Iterator;
public class Hanoi {
// 塔
class Tower<E> {
// 塔编号
private int number;
// 塔名称
private String name;
// 存放盘子的栈
private Stack<E> stack = new Stack<E>();
public Tower(int number, String name) {
this.number = number;
this.name = name;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public Stack<E> getStack() {
return stack;
}
}
// 盘子
class Tray {
// 盘子编号
private int number;
// 盘子名称
private String name;
public Tray(int number, String name) {
this.number = number;
this.name = name;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public String toString() {
return name;
}
}
public <T> void hanoi(int num, Tower<T> from, Tower<T> middle, Tower<T> to) {
if (num == 1) {
move(from, middle, to);
} else {
// 将num-1个盘子从from塔上移到middle塔上
hanoi(num - 1, from, to, middle);
// 将第num个盘子移到to塔上
move(from, middle, to);
// 将num-1个盘子从middle塔上移到to塔上
hanoi(num - 1, middle, from, to);
}
}
private <E> void move(Tower<E> from, Tower<E> middle, Tower<E> to) {
E tray = from.getStack().pop();
to.getStack().push(tray);
StringBuilder sb = new StringBuilder();
sb.append("=====================Hanoi.move()======================\n")
.append(" Move tray : ").append(((Tray) tray).getName())
.append(" from ").append(from.getName()).append(" to ")
.append(to.getName()).append("\n ").append(from.getName())
.append(":").append(format(from)).append(",")
.append(middle.getName()).append(":").append(format(middle))
.append(",").append(to.getName()).append(":")
.append(format(to));
System.out.println(sb.toString());
}
private <E> String format(Tower<E> tower) {
Iterator<E> i = tower.getStack().iterator();
if (!i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
while (i.hasNext()) {
sb.append(i.next().toString()).append(",");
}
sb.replace(sb.length() - 1, sb.length(), "]");
return sb.toString();
}
public static void main(String[] args) {
Hanoi hanoi = new Hanoi();
Tower<Tray> from = hanoi.new Tower<Tray>(1, "1号塔");
Tower<Tray> middle = hanoi.new Tower<Tray>(2, "2号塔");
Tower<Tray> to = hanoi.new Tower<Tray>(3, "3号塔");
int num = 4;
for (int i = num; i > 0; i--) {
Tray tray = hanoi.new Tray(i, i + "号盘子");
from.getStack().push(tray);
}
hanoi.hanoi(num, from, middle, to);
}
}
另外,递归还有它很广泛的应用比如象棋游戏就可以用递归来写:

621

被折叠的 条评论
为什么被折叠?



