题目:
你在递归函数里面的for循环有问题,
问题的对数组的访问越界了。
si[8]这个数组只有8个单位长度,里面只有8个元素,有si[0],si[1],si[2],si[3],si[4],si[5],si[6],si[7]。
for循环中i=0开始,再到i=8的时候,这个时候进行了第9次循环,访问的是si[8],访问越界了。
下面是出问题的地方:
for (int i = 0; i <= 8; i++)
{
if (a == si[i][0] && b == si[i][1])
return path(a + l, b) + path(a, b + 1) ;
}
这个地方应该这么修改。for循环判断语句不能i<=8,应该是i<8
for (int i = 0; i < 8; i++)
{
if (a == si[i][0] && b == si[i][1])
return path(a + 1, b) + path(a, b + 1) ;
}
【以下回答由 GPT 生成】
首先,要解决递归异常的问题,需要考虑两个方面:基本情况和递归条件。
在你的代码中,基本情况是当卒子到达终点时,即x和y都等于0时,我们可以停止递归并增加计数。
递归条件是当卒子的位置不符合要求时,我们需要继续递归。在你的代码中,当x或者y小于0时,就会终止递归。
然而,你的代码有一个问题,当卒子的位置在(0, 0)之下时,会导致一直递归下去,直到栈溢出。因此,我们需要在递归条件中做一些修改。
下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
int count = 0;
void dfs(int x, int y)
{
if(x == 0 && y == 0)
{
count++;
return;
}
if(x < 0 || y < 0 || (x == 0 && y < 3) || (x < 3 && y == 0)) // 添加了两个新的判断条件
return;
dfs(x-1, y);
dfs(x, y-1);
}
int main()
{
int x, y;
printf("请输入卒子的位置(x, y):");
scanf("%d %d", &x, &y);
dfs(x, y);
printf("过河的路径数为:%d\n", count);
return 0;
}
修改后的代码添加了两个新的判断条件:(x == 0 && y < 3)和(x < 3 && y == 0)。这是因为在题目中已经给出,卒子不能跳过(0, 2)和(2, 0)这两个位置,否则会遇到障碍物。因此,我们需要在递归条件中考虑到这一点。
希望这个解决方案能够帮助你解决递归异常的问题。如果还有其他问题,请随时告诉我。
【相关推荐】