建议你重温一下数学归纳法求n的阶程,
1: 如果n=1,则n的阶程=1
2:如果n>1,则n的阶程=n * (n-1)的阶程。
1: 如果n=1,则n的阶程=1
2:如果n>1,则n的阶程=n * (n-1)的阶程。
解决方案 »
- 如何将DataGridView中的数据复制到另一个DataGridView中?
- .dll文件可以用脚本调用?
- C#XmlSerializer的问题,如果我想序列化/反序列化一个dll里的某个类,内详。
- 关于向Sqlserver数据库添加数据的问题
- 我想把一个gataGrid的数句导出来(是csv和xls格式的)各位帮下忙拉
- 求助
- 急...重绘控件拖动窗体时,只要控件部分被掩盖了就会出现残影这样的问题,请教好何解决!!!
- 怎样在web下将DataTable数据导入Excel并显示
- 我用C#写了一个扫描程序我在开扫的时侯创建20个线程可是有的端口在很长时间,都处于等待状态我不告诉你
- 如何将拖动后的System.Windows.Forms.ListBox 中的Item 去掉
- listview 数据移动
- 大家好,想問一下有哪位朋友用C#做ORM架構的呢?能否開源一下呢
将n-1个盘子经过three转到two
将剩下的一个盘子移到three
再将那n-1个盘子经过one移到three
然后1,3步骤在进行如上操作,知道剩下一个盘子。if (n == 1) move(one, three);
然后再由(n==1)的情况递推得到结果
递归是典型的,将人的操作降到最低,电脑运算升到最高的算法,从效率的角度看是不提倡的
2.进入hanoi(3, 'A', 'B', 'C')方法,由于n=3,故进入else循环,此时递归调用,又遇到hanoi方法,但hanoi(2,'A','C','B'),此时n=2,又进入else循环,hanoi(1,'A','B','C'),此时n=1,进入if循环,执行move('A','C')方法,故在控制台输出A->C,此时n=1执行完毕;
3.同理,逆方向思考,此时程序已经将hanoi(1,'A','B','C')执行完毕了,在n=2时,执行move('A','B')故在控制台输入A->B;
4.然后程序执行hanoi(1, 'A','C' ,'B' ),执行move('C','B')这时,彻底将n=2执行完;
5.同理,执行N=3,过程有点长,但原理是不变的,所以省略了,各位自己应该已经会了;
-------------------------------------------------------
塔的移动过程:
1.先将a塔最上面的圈取下,放到c塔;
2.再将a塔第二个圈取下,放到b塔;
3.再将c塔上的圈,放到b塔;
4.将a塔上的圈取下,放到c塔,此时a塔为空,b塔为一个n=2的汉诺,c塔目标塔;
5.同理,再对b塔递归,直到其n=0;
-------------------------------------------------------
给分哦!!!我是今年考研,所以才复习过的,所以还是有点记忆的,可能表述不太清楚,但过程应该没有错的,递归的效率无论是从空间复杂度来说,还是时间复杂度来说,效率都是很高的能写出递归算法,应该是很优秀的算法了,整个过程就是先压栈,到达条件后,在依次出栈,故可以逆向的思考!
#include <iostream>
void hano(int n,char a,char b,char c);
void move( char source,char dest);
using namespace std;
int main()
{
int n ;
cin>>n;
cout<<"共:"<<n<<"个盘子"<<endl;
hano(n,'1','2','3');
cout<<"end"<<endl;
return 0;
}
void hano(int n,char a,char b,char c)
{
cout<<"hello"<<endl;
if (n==1)
{
move (a,c);
}
else
{
cout<<"n="<<n<<"$"<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"开始"<<endl;
hano(n-1,a,c,b);
cout<<"n="<<n<<"@"<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"中间"<<endl;
move(a,c);
cout<<"n="<<n<<"#"<<endl;
hano(n-1,b,a,c);
cout<<"n="<<n<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"最后"<<endl;
}
}
void move( char source,char dest)
{
cout<<"把 "<<source<<" 上的石块移到"<<dest<<"上"<<endl;
}
可以在程序中加入输出,就可以看出汉诺塔程序是咋执行的了