1.6动态规划之经典递归-汉诺塔

问题不再多做赘述:

分析:
1)以动态规划的思维分析:
将N个盘子从左移到右
①首先考虑怎样将第N个盘子移到右边去,
②分为三步,1.将上面的n-1移到中间,2.将N移到右边,3.将n-1移到右边。如何以动态规划的思维将这个推导出这最后一步前面的的移动方式。
此时n已经移动完成,那么我们去移动第n-1个,同样是上面的三步,只是现在的中间柱子变为
此时考虑如何将上面的n-1移动,1.将n-2移到中间,(此时n-1原在柱子已经从左变为中,而我们目标柱为右,所以中转柱为 左柱(萨斯给!!)),2.将第n-1从“左柱”移动到右柱,3.将n-2从中柱移动到右柱。
由上面的递归得出所有的移动状态。

代码实现:

public void main(int n){
	if(n > 0){
		lTor(n,"left","mid","right")
	}

}

//移动过程
public void lTor(int n, String left,String,mid,String,right){
	if(n==1){
		sout("move  " + n + "  " + left + "  To  " + right);
	}else{
		lTor(n-1,left,right,mid);
		lTor(1,left,mid,right);
		lTor(n-1,mid,left,right);
}
}//该方法为递归调用实现,因为函数栈的关系,有额外空间复杂度N。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值