暴力递归:暴力递归就是尝试
1.把大问题转化为规模缩小的同类问题的子问题
2.有明确的不需要进行递归的条件(base case)
3.有得到了子问题之后的决策过程
4.不记录每一个子问题的解(如果记录了那就是动态规划)
汉诺塔问题,假设总共有N个圆盘 三个杆子(ABC)(A为起始杆,C为目的杆子)
思路:
1.把1到N-1个圆盘从A移动到B
2.把第N个圆盘从A移到C
3.把1到N-1个圆盘从B移动到C
N层汉诺塔最优步数是2^N - 1
T(N) = 2*T(N-1) + 1
其实可以这样思考,总共只有from to other三个杆子
1.把1到N-1个圆盘从from移动到other
2.把第N个圆盘从from移动到to
3.把1到N-1个圆盘从other移动到to
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
public class hannoi{
public static void hannoi1(int n){
if(n > 0){
func(n,"left","right","mid");
}
}
public static void func(int N,String from,String to,String other){
if(N == 1){//base case
System.out.println("Move 1 from " + from + " to " + to);
}else{
func(N - 1,from,other,to);
System.out.println("Move " + N + " from " + from + " to " + to);
func(N - 1,other,to,from);
}
}
public static void main(String[] args) {
int n = 3;
hannoi1(n);
}
}