汉诺塔问题与2的n次方

汉诺塔问题与2的n次方

汉诺塔次数问题

汉诺塔是根据一个传说提出的问题:
有三根柱子A,B,C。A柱上有N个圆盘,并且N个圆盘从下到上,尺寸越来越小。要求在遵循以下规则的情况下将N个圆盘从A柱移动至C柱。
规则一:每次只能移动一个圆盘。
规则二:大圆盘绝对不能放在小圆盘之上。
规则三:可利用B柱,但不能违背规则一,规则二。
问:如何移动?至少移动多少次?

解法

第一步: 将较小的n-1个圆盘通过C柱,从A柱移动到B柱。
第二步: 将剩下的最大的一个圆盘移动到C柱。
第三步: 将n-1个圆盘通过A柱,移动到C柱上。

对于第三步而言,如果看作(n-2)个小圆盘和一个大圆盘,那解题思路便与第一第二布完全相似。于是,汉诺塔问题成为了递归算法的标准实例。

package com.demo;

import java.util.Scanner;
//汉诺塔
public class Main {
	int n;
	
	public Main(){
		Scanner sys=new Scanner(System.in);
		if(sys.hasNext()){
			n=sys.nextInt();
		}
		sys.close();
		System.out.println(getResult(n));
	}
	
	public int getResult(int n){
		//n属于(0,20);
		int sum=0;	//移动次数
		if(0==n){
			return 0;
		}if(1==n){
			return 1;
		}else{
			sum=getResult(n-1)+sum;	//将较小的n-1从A移到B
			sum++;		//将最大的一个从A移到C
			sum=getResult(n-1)+sum;//将n-1个圆盘从B移到C
			return sum;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main();
		
	}

}

n步数规律
23 2 2 − 1 2^2-1 221
37 2 3 − 1 2^3-1 231
415 2 4 − 1 2^4-1 241
531 2 5 − 1 2^5-1 251

写到这里,我们已经能够看出汉诺塔的次数正是( 2 n 2^n 2n-1)。

现在,再来分析我们的解题思路
第一步:sum=F(n-1);
第二步:sum=1;
第三步:sum=F(n-1);

所以sum=2F(n-1)+1;

于是 2 n 2^n 2n-1= 2F(n-1)+1;

而在数学上,F(n)=2F(n-1)+1,可以推导出F(n)= 2 n − 1 2^n-1 2n1,啧啧,如此巧合却又顺理成章,不得不让人赞叹前人的智慧啊。
这样一来,对于2的n次方,也多了一种递归求解法。实在是妙。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值