汉诺塔问题(暴力递归)

暴力递归:暴力递归就是尝试
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);
	}
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值