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

汉诺塔实现问题:swap_disk函数为何无法正确更新指针?

汉诺塔递归实现问题修复方案

1. 解决swap_disk无法更新指针变量的问题

你定义的tower_1、tower_2、tower_3是全局指针,但如果swap_disk函数的参数是传值传递指针,函数内部修改的只是指针的副本,不会影响全局的指针变量。要让函数能修改全局指针,有两种可行方案:

  • 方案一:将swap_disk的参数改为指针的指针(二级指针),示例代码:
    void swap_disk(Stack **from_tower, Stack **to_tower) {
        // 取出源塔栈顶元素
        Disk *disk = pop(*from_tower);
        // 将元素推入目标塔
        push(*to_tower, disk);
        // 若需直接交换指针指向,可执行以下操作
        // Stack *temp = *from_tower;
        // *from_tower = *to_tower;
        // *to_tower = temp;
    }
    
    调用时传入全局指针的地址:swap_disk(&tower_1, &tower_3);
  • 方案二:既然tower_1等是全局变量,swap_disk可直接操作这些全局变量,无需传递指针参数,从根源避免传值导致的副本问题。

2. 为push和pop添加异常/错误处理

栈操作必须处理边界情况,否则会出现越界访问或无效操作:

  • push函数:检查栈当前高度是否等于最大容量,若已满则返回错误码或提示信息,示例:
    int push(Stack *stack, Disk *disk) {
        if (stack->height >= stack->max_size) {
            printf("错误:栈已满,无法推入新元素\n");
            return -1;
        }
        stack->disks[stack->height++] = disk;
        return 0;
    }
    
  • pop函数:检查栈当前高度是否为0,若为空则返回空指针或提示信息,示例:
    Disk* pop(Stack *stack) {
        if (stack->height == 0) {
            printf("错误:栈为空,无法弹出元素\n");
            return NULL;
        }
        return stack->disks[--stack->height];
    }
    

3. 修复递归基例无法触发的问题

递归基例(通常是n == 1时直接移动盘子)无法触发的根本原因是指针未正确更新,导致函数无法感知栈的状态变化。解决第一个问题后,swap_disk能正确修改栈的内容或指针,递归过程中栈的高度会正常变化,当n == 1时基例代码会执行,将盘子移到目标塔,第三个塔的高度才会逐步增加,递归逻辑就能正常收尾。


内容的提问来源于stack exchange,提问作者Jonathan Isozaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:31:16