You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在汉诺塔递归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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:31:31