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



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

#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: %dn", position);
printf("x: %d, y: %dnn", 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。为什么它会跳跃?它是如何做到的?如何预防?

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

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);

最新更新