Hanoi汉诺双塔问题

Hanoi汉诺双塔问题

题目描述

给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:

(1)每次只能移动一个圆盘;

(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;

任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。

输入数据

输入为一个正整数 n ,表示在 A 柱上放有 2n 个圆盘。

输出数据

输出文件hanoi.out仅一行,包含一个正整数,为完成上述任务所需的最少移动次数 An 。

样例输入

Sample 1:
1

Sample 2:
2

样例输出

Sample 1:
2

Sample 2:
6

样例说明

对于50%的数据, 1< =n< =25
对于100% 数据, 1< =n< =200

提示:设法建立An与An-1的递推关系式。

  • 原始的汉诺塔问题:汉诺塔大家应该都知道,也应该都直到汉诺塔的递推公式是什么。怎样简单的理解呢?不用太多的推算,建议大家这样理解:对于n个盘子来说,前n-1个圆盘全部移走之前,第n个圆盘肯定是一直在初始的杆子的最下面。而且又因为第n个是最大的,它不能放到任何盘子上方,所以在移动前n-1个圆盘的时候,最大的那个可以忽略。然后,把n-1个圆盘移到第二根杆子上之后(这时已经移动了f(n-1)次),是不是只有最大的那个还在原来的杆子上?这时,把最大的那个圆盘移到第三根杆子上,这又移动了一次,然后干什么呢?把那n-1个圆盘移到第三根杆子上!又是f(n-1)次!所以f(n)=2*f(n-1)+1!
  • 汉诺双塔:看懂上一段的,应该已经领会到汉诺n塔的精髓了。无非就是先把n-1组圆盘移到第二根杆子上,然后把第n组圆盘移到第三根杆子上,然后再把n-1组圆盘移到第三根杆子上,一共移动了f(n)=2*f(n-1)+n次。
  • 坑爹之处:你以为这就完了?你可太天真了(因为我就是这么天真,哼)!这题里面可能出现的数高达200,到那会儿早就超过了unsigned long long的范围。所以如果用C++的话就要用高精度。具体就是用数组来保存数字的每一位,然后人为的实现加法和进位,最后输出数组就可以了。

然而数据太大这种问题怎么能让我们人类考虑呢?然后我就选择了Python…
Python不用考虑这个问题!多大的数都可以!哈哈哈!
这是Python代码,是不是很简洁……

def hanoi(n):
    if n == 1:
        return 2
    else:
        f = 2 * hanoi(n - 1) + 2
    return f


a = int(input())
print(hanoi(a))

你可能感兴趣的:(Python,练习题,Python,递归)