问题:
(Hanoi塔) 有三个塔,第一个塔上有64个直径不同的盘子,盘子是按从上到下直径依次递增的顺序放置的。假设按照如下规则将盘子从塔1移动到塔3上:
1.每次只能移动一个盘子。
2.任何时候,上门的盘子的直接都不能比下面的盘子的直径大 。
求完成这个任务所需进行的全部移动数。
分析:
当只有一个盘子(n=1)时,只需要移动一次即可, 当有两个盘子(n=2)时,需要移动3次,当有3个盘子(n=3)时,需要移动7次。 进一步分析不难看出,n个盘子所需移动的次数为n-1个盘子所需移动次数的两倍+1. 即f(n)= 2(fn-1) +1。用递归实现程序如下
/***********************************************
Hanoi塔求值
************************************************/
#include<stdio.h>
unsigned __int64 hanoi(int n);
void main(void)
{
int n;
printf("input n:");
scanf("%d",&n);
printf("\nresult :");
printf("%I64u",hanoi(n));
getch();
}
/*************************************************
函数名称:hanoi?
参数列表:int n---盘子数
返 回:int-----移动次数
描 述:递归实现hanoi塔移动次数求值
**************************************************/
unsigned __int64 hanoi(int n)
{
if(n == 1)
{
return 1;
}
else
{
return (2*hanoi(n-1) +1);
}
}
运行程序可知移动次数是随n按指数级增长的,当n=64时已经超过64位无符号数所能表示的最大值,需要移动1800亿亿