如何在汉诺塔递归move函数中使用指针实现移动次数计数器?
用指针实现汉诺塔移动次数计数器
我懂你想通过指针来统计汉诺塔move函数里的实际移动次数,以此加深对指针的理解——之前用全局变量成功了,但指针版一直卡壳对吧?咱们一步步把代码改对,把指针的用法掰扯清楚。
首先得明确:指针的核心是让所有递归层级都操作同一个计数器变量,而不是每个递归栈帧里的副本。原来的move函数没有传递计数器的入口,所以第一步要给move加个指针参数,然后在每次实际移动的时候,通过指针修改计数器的值。
修改后的完整代码
#include <stdio.h> // 假设你已经实现了size()函数,这里模拟返回3个盘子的情况 int size() { return 3; } // 新增int* count参数,用来传递计数器的地址 void move(unsigned int moves, char source, char spare, char dest, int *count) { if (moves == 0) { return; // 简化空逻辑 } else { // 递归调用时必须传递同一个计数器指针 move(moves - 1, source, dest, spare, count); printf("Move disk %u from pole %c to pole %c.\n", moves, source, dest); // 解引用指针,给实际的计数器变量加1 *count += 1; move(moves - 1, spare, source, dest, count); } } int main() { char source = 'A'; char spare = 'B'; char dest = 'C'; int moves = size(); int move_count = 0; // 初始化计数器为0 // 传递计数器的地址(&取地址符)给move函数 move(moves, source, spare, dest, &move_count); // 最后输出统计结果 printf("Total number of moves: %d\n", move_count); return 0; }
关键细节(你之前可能踩的坑)
- 值传递vs指针传递:如果直接传
int count,那每次递归都会创建count的副本,修改的只是副本,main里的move_count根本不会变。传指针int* count,相当于告诉所有递归层:“去修改这个内存地址里的变量”,所有操作都会同步到main的变量上。 - 递归时必须传同一个指针:递归调用
move的时候,一定要把count指针原封不动传下去,不能重新定义变量或者传其他地址,否则计数器会乱。 - 解引用指针才是修改值:别写成
count += 1——这是修改指针本身的地址,不是修改计数器的值!必须用*count来访问指针指向的变量,再做累加。
运行这段代码,3个盘子的话会输出7次移动,和汉诺塔的公式2^n -1一致,说明计数器工作正常。
内容的提问来源于stack exchange,提问作者midas kortman
相关产品推荐
相关产品推荐

