user-0 提问: 汉诺塔问题

回复:
user: user-1
content: 引用 19 楼 wenbo228228 的回复: 为什么全是32位的，话说中国的学生也可以免费用吗 有64的，不知道学生是否免费  不过MS VS每个版本的编译器跟对应的IDE，都会预先自行透露几个可用的SN 并不是那个破解的，不知MS是何意思。

user: user-1
content: 引用 20 楼 wenbo228228 的回复:“另外，那个move 函数优化了，省略了一个参数。”——————————对，move默认移动最上面那个盘子。 你说的源针，暂存针，目标针是指的指针吗？我从来没听说过这3个针？呵呵，我刚自学c不久，最近在学指针 汉诺塔有三个位置，似乎有一种翻译吧（说法）， 是每个位置是一根针 ，盘子是放在针上穿着的，盘子中间有孔 源针，暂存针，目标针的针， 指的是汉诺塔原本就有的那根针，不是指针。  来个示意图， 开始状态：         A              B            C        \-|-/             |              |     \-- |--/           |              |   \----|----/         |              | ------------------------------------- 结束状态：          A              B            C          |               |             \-|-/          |               |          \-- |--/          |               |        \----|----/  -------------------------------------------

user: user-0
content: 引用 17 楼 lm_whales 的回复:你汉诺塔的逻辑不清楚，所以搞不清这题为何这样、 另外，那个move 函数优化了，省略了一个参数。  你那么做，就没法递归了， 之所以用递归，是因为有某种内在逻辑，或者数据结构，适用这种程序逻辑 一般是一些递推关系，树，图等等。  汉诺塔的逻辑是， 1）你只有把上面所有盘子搬到别的针上，最大的那个盘子才能搬走。 2）你可以借助其他针，暂时存放那些盘子 3）汉诺塔递归路径，其实是一种树状结构，是二叉树的结构。 一般树，或者更复杂的结构，特别适合用递归处理。  举例，你要把最大的盘子从Ａ搬到Ｃ，那么上边的Ｎ－１　个盘子，必须从A搬到 Ｂ 然后最大的才能搬到C， 至此， 因为，所有其他盘子都在B，所以还需要，从B搬到 C 搬运过程中，非源非目的，那个要用来暂存，上边的那些较小的盘子。  所以 A 代表 源针，B代表暂存针，C代表目标针 递归过程中，A 代表 源针，B代表暂存针，C的含义不变。 但是针的名字（位置，代号）是可以改变的。  所以只能用变量。 “另外，那个move 函数优化了，省略了一个参数。”——————————对，move默认移动最上面那个盘子。 你说的源针，暂存针，目标针是指的指针吗？我从来没听说过这3个针？呵呵，我刚自学c不久，最近在学指针

user: user-0
content: 为什么全是32位的，话说中国的学生也可以免费用吗

user: user-0
content: 引用 16 楼 zhao4zhong1 的回复:http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装 那个是32位的，我是win7 64位

user: user-1
content: 你汉诺塔的逻辑不清楚，所以搞不清这题为何这样、 另外，那个move 函数优化了，省略了一个参数。  你那么做，就没法递归了， 之所以用递归，是因为有某种内在逻辑，或者数据结构，适用这种程序逻辑 一般是一些递推关系，树，图等等。  汉诺塔的逻辑是， 1）你只有把上面所有盘子搬到别的针上，最大的那个盘子才能搬走。 2）你可以借助其他针，暂时存放那些盘子 3）汉诺塔递归路径，其实是一种树状结构，是二叉树的结构。 一般树，或者更复杂的结构，特别适合用递归处理。  举例，你要把最大的盘子从Ａ搬到Ｃ，那么上边的Ｎ－１　个盘子，必须从A搬到 Ｂ 然后最大的才能搬到C， 至此， 因为，所有其他盘子都在B，所以还需要，从B搬到 C 搬运过程中，非源非目的，那个要用来暂存，上边的那些较小的盘子。  所以 A 代表 源针，B代表暂存针，C代表目标针 递归过程中，A 代表 源针，B代表暂存针，C的含义不变。 但是针的名字（位置，代号）是可以改变的。  所以只能用变量。

user: user-2
content: VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-0
content: 我用codeblocks，有个问题，今天编译不了，看图片，不知道如何解决 codeblock也是这么操作吗

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

user: user-3
content: 引用 10 楼 wenbo228228 的回复:我知道改了之后是常量，但是为什么要用变量？  你们觉不觉得这个校验码很难看清？因为这是一个动态的确定参数，比如你现在调用函数，那么这个函数本身的含义你可以理解为把第一个参数上的塔，移到第三个参数的塔上。那么，当你循环的过程中需要把第二个参数的塔移到第三个上面，那你还需要写另外一个函数吗？！你只要改变实参的顺序就可以了。 递归，初次调用可以使用变量或者常量的参数，但是进入递归循环，那么就要使用变量（特殊情况除外）。

user: user-0
content: 引用 12 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  完全不懂，你用什么编译的啊，能解释下单步跟踪吗？

user: user-0
content: 我知道改了之后是常量，但是为什么要用变量？  你们觉不觉得这个校验码很难看清？

user: user-4
content: 一个是变量，一个是常量

user: user-0
content: 这么说吧，如果把调用部分 han(i-1,A,C,B);  printf("move disc %d from %c to %c\n",i,A,C);  han(i-1,B,A,C); 改成 han(i-1,A,C,B);  printf("move disc i from A to C\n");  han(i-1,B,A,C); 我知道这样是错的，因为显示部分不能更改，只能是move disc i from A to C，但是原来的为什么就可以，系统怎么就可以根据这个算法解决汉诺塔问题？

user: user-5
content: 递归就是自己调用自己 ，知道某个条件不成立 停止调用

user: user-3
content: 引用 4 楼 wenbo228228 的回复:还有一个问题，我才学c，对这个汉诺塔搞不懂，听说这是递归，这个自定义函数究竟是怎么实现的啊？递归的本质是什么呢使用引用，别人的消息提醒里面会收到的。引用LinkButton在你要引用的那个楼层的右下角

user: user-3
content: 引用 4 楼 wenbo228228 的回复:还有一个问题，我才学c，对这个汉诺塔搞不懂，听说这是递归，这个自定义函数究竟是怎么实现的啊？递归的本质是什么呢递归，说白了，就是自己调用自己。比如汉诺塔主函数中n为2，第一次调用本函数时候i为2，那么在这个函数调用的时候，中间会调用两次i为1的han函数，在i为1的han函数调用中，满足i==1，就OK，打印所需的信息，结束这个函数的调用。接着，i为2的han函数因为调用完成两次i为1的han函数，而函数结束，至此，递归调用完成。

user: user-0
content: 还有一个问题，我才学c，对这个汉诺塔搞不懂，听说这是递归，这个自定义函数究竟是怎么实现的啊？递归的本质是什么呢

user: user-6
content: 你先定义char A, B, C;相当于给出3个char型的标签，至于贴的什么东西，你没给出， 而你又要电脑去拿标签的内容，电脑自然报错，说不知道标签的内容