1)在把n个盘子从A移动到C的过程中,必然存在一步,是把最大的盘子从A拿出来。要想把最大的盘子从A移动到别的某个柱子上(B或C),就必须保证剩下的n-1个盘子不能碍事,得好好堆在剩下那个柱子(C或B)上。要保证n-1个盘子都在剩下那个柱子上,至少得付出F(n-1)次移动。
2)在把n个盘子从A移动到C的过程中,必然存在一步,是最大的盘子被放到了C上,而且此后再也没动过。在这步实行之前,最大的盘子要么在A要么在B上,而相应地别的n-1个盘子要么在B要么在A上。在这步实施之后,我们只要花至少F(n-1)的步数把n-1个盘子从要么B要么A挪动到C上就行了。这些步数必然和1)中的步数不重叠,因为这时候最大盘子在C上,而1)中最大盘子在A上。
3)最大的盘子至少被挪动了一次。而且这一次肯定没被算在1)或2)的“至少F(n-1)步”中,因为后者只挪动较小的那n-1个盘子。
把1),2),3)加起来,就是至少F(n-1) + F(n-1) + 1步。不能再少了。#include<stdio.h>#include<stdlib.h>void move(char x,char y)//打印步骤{ PRintf("%c-->%c/n",x,y);}void hanio(int n,char one ,char two,char three){ if(n==1) { move(one,three); }else{ hanio(n-1,one,three,two);//把n-1个盘子移动到借用塔上 move(one,three); hanio(n-1,two,one,three); }}int main(){ int n; printf("please input the number of dishes:/n"); scanf("%d",&n); hanio(n,'A','B','C'); system("pause");}
新闻热点
疑难解答