来个大神帮小弟我理解下汉诺塔的算法好么,绕的好晕·

来个大神帮我理解下汉诺塔的算法好么,绕的好晕··
void hanoi(int n, char A, char B, char C) 
{
if(n == 1) 
{
printf("将第 %d 个盘子由 %c 挪到 %c 上\n\n", n, A, C);
i++;
}
else
{
hanoi(n-1, A, C, B);
printf("将第 %d 个盘子由 %c 挪到 %c 上\n\n", n, A, C);
hanoi(n-1, B, A, C);
i++;
}
}

看得好晕,就是
hanoi(n-1, A, C, B);
printf("将第 %d 个盘子由 %c 挪到 %c 上\n\n", n, A, C);
hanoi(n-1, B, A, C);

这两句,他A B C的顺序为什么是这样的,请大神告诉我怎么理解这个

------解决方案--------------------
两个函数的最终目的都是将剩余的盘子的最下面的盘子放在C上。

第一步:如果想把A最下面的盘子放到C上,就必须把余下的n-1个盘子放到B,所以hanoi(n-1, A, C, B);相当于把n-1个盘子放在B上(即等于最下面的盘子放在了C上了)。

第二步:如果想把B上最下面的盘子放到C上,就必须把余下的n-2个盘子放到C上,最下的盘子就放在了A上(这时就等于放在了C上),所以为函数hanoi(n-1, B, A, C);

其它的情况都被这两种情况包括了。。。

个人愚见。


------解决方案--------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

------解决方案--------------------
引用:
第二步:如果想把B上最下面的盘子放到C上,就必须把余下的n-2个盘子放到C上,最下的盘子就放在了A上(这时就等于放在了C上),所以为函数hanoi(n-1, B, A, C);

这句真心没看懂····要把B上面最下的盘子放到C上,把剩下n-2个盘子放到C上,这时候再把最下面的盘子放到A上··就算是放在C上,可是怎么放上去啊,大的不能放在小的上面啊


第二句hanoi(n-1,B,A,C);经过第一步后,得到的结果是:B上有n-1个盘子,A上没有盘子,C上有一个最大的盘子,接下来要做的是将B上的n-1个盘子,利用A移动到C盘上,来实现将A上的n个盘子移动到C盘上的最终目的,故有hanoi(n-1,B,A,C).
个人意见
------解决方案--------------------
递归问题最好先搞懂递归的结束条件,汉诺塔的结束条件就是盘子为1时就可以直接挪