首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初学者C练习中意外的递归步骤

初学者C练习中意外的递归步骤
EN

Stack Overflow用户
提问于 2020-06-20 22:07:12
回答 1查看 57关注 0票数 1

我正在编写一个初学者级别的递归函数,它可以在给定的12x12迷宫中找到一条路径。我有一个单独的函数来计算初始位置(初始正方形的数量),但在这个任务中,位置是给定的,它是59的正方形。函数mazeTraverse根据探路器的位置计算xy,将maze[y][x]转换为" x ",然后调用自身以根据周围的情况更改位置。

代码语言:javascript
复制
#include <stdio.h>

void mazeTraverse(char *[][12], int);

int main()
{
    char *labyrinth[12][12] = {{" # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # "},
                               {" # ", " . ", " . ", " . ", " # ", " . ", " . ", " . ", " . ", " . ", " . ", " # "},
                               {" . ", " . ", " # ", " . ", " # ", " . ", " # ", " # ", " # ", " # ", " . ", " # "},
                               {" # ", " # ", " # ", " . ", " # ", " . ", " . ", " . ", " . ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " . ", " . ", " # ", " # ", " # ", " . ", " # ", " . ", " . "},
                               {" # ", " # ", " # ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # "},
                               {" # ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " # ", " . ", " # "},
                               {" # ", " # ", " # ", " # ", " # ", " # ", " . ", " # ", " # ", " # ", " . ", " # "},
                               {" # ", " . ", " . ", " . ", " . ", " . ", " . ", " # ", " . ", " . ", " . ", " # "},
                               {" # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # ", " # "}};
    int startingLocation = 59;
    
    mazeTraverse(labyrinth, startingLocation);

    return 0;
}

void mazeTraverse(char *maze[][12], int position)
{
    int y, x, exCounter, inCounter;
    
    y = position / 12;
    x = position % 12;
    
    maze[y][x] = " x ";
    
    for (exCounter = 0; exCounter <= 11; ++exCounter) {
        for (inCounter = 0; inCounter <= 11; ++inCounter)
            printf("%s", maze[exCounter][inCounter]);
        printf("\n");
    }
    printf("\n");
        
    printf("Position: %d\n", position);
    printf("x: %d, y: %d\n\n", x, y);
    
    if (maze[y - 1][x] == " # " && maze[y][x - 1] != " # ")
        mazeTraverse(maze, position - 1);
    if (maze[y - 1][x] == " . " && maze[y][x + 1] != " . ")
        mazeTraverse(maze, position - 12);                  // Up until this point everything goes as it should
    if (maze[y - 1][x] != " . " && maze[y + 1][x] != " # ") // This if statement is the root of the problem
        mazeTraverse(maze, position + 12);
    
}

我还没有写完这个函数,我也不想要一个解决方案。如果你执行这段代码,你会注意到探路者在第一个左转弯后向下,直到它遇到一个" # ",然后它从41号广场跳到34号广场,它在最右边的隧道内,并从那里开始下降。我尝试在mazeTraverse中重新构造第三个if语句,但它总是跳到34、46或70的平方。为什么它会跳跃?它是怎么做到的?如何防止这种情况发生?

EN

回答 1

Stack Overflow用户

发布于 2020-06-21 04:50:01

也许下一代的C语言学习者会需要这个。下面是一段使函数正常工作的if语句。显然,我的问题的答案是把return放在每个递归调用的前面。

代码语言:javascript
复制
if (maze[y - 1][x] != " . " && maze[y][x - 1] == " . ")
    return mazeTraverse(maze, position - 1);
if (maze[y - 1][x] != " . " && maze[y + 1][x] != " # ")
    return mazeTraverse(maze, position + 12);
if (maze[y + 1][x] == " # " && maze[y][x - 1] != " . " && maze[y][x + 1] != " # ")
    return mazeTraverse(maze, position + 1);
if (maze[y - 1][x] == " . ")
    return mazeTraverse(maze, position - 12);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62486880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档