递归算法所体现的“重复”一般有三个要求:
经典案例:
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); }}另外,递归还有它很广泛的应用比如象棋游戏就可以用递归来写: