谁能帮我看看这段递归代码为什么错误,调试好多遍了

libinden71 2016-08-11 09:13:26

#define N 10

void show(int(*a)[N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
}

void loop5(int(*a)[N], int i, int j, int k)
{
static max = 0;
static temp = 1;
if (k>=(N+1)/2)
{
return;
}
else
{
if (j < N - k)
{
a[i][j++] = temp++;
max=1;
return loop5(a, i, j, k);
}
if (max == 1)
{
j--;
i++;
}

if (i < N - k)
{
a[i++][j] = temp++;
max = 2;
return loop5(a, i, j, k);
}
if (max == 2)
{
i--;
j--;
max = 0;
}

// if (j >= k)
// {
// a[i][j] = temp++;
// max = 3;
// return loop5(a, i, j - 1, k);
// }
// if (max == 3)
// {
// j++;
// i--;
// max = 0;
// }
//
//
// if (i > k)
// {
// a[i][j] = temp++;
// max = 4;
// return loop5(a, i - 1, j, k);
// }
// if (max == 4)
// {
// i++;
// j++;
// max = 0;
// }
return loop5(a, i, j, k + 1);
}

}

void main()
{
int a[N][N] = { 0 };
loop5(a, 0, 0, 0, 0);
show(a);
system("pause");
}

里面的4段递归,前面2段 显示是正确,后面这2段 不知道为什么一起运行就错误,求大神帮忙看看 哪里错了?还是说整个递归本来就有问题 只是我没发现?
...全文
177 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinden71 2016-08-12
  • 打赏
  • 举报
回复
引用 9 楼 FFY_1208 的回复:
你这个是C语言,循环里不可以加定义的.主函数里的实参数量比你设置的形参数量多
疏忽了
libinden71 2016-08-12
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
你代码没帮你调试,初步看了下 loop5 不是只有4个参数,为何主函数中调用时有5个参数 其次是提示什么错误,检查是否递归太深导致栈溢出
我居然没发现 疏忽了
libinden71 2016-08-12
  • 打赏
  • 举报
回复
引用 8 楼 ilikehigame 的回复:
#define N 10 void show(int(*a)[N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%7d", a[i][j]); } printf("\n"); } } void loop5(int(*a)[N], int i, int j, int k) { static max = 0; static temp = 1; if (k>=(N+1)/2) { return; } else { if (j < N - k) { a[i][j++] = temp++; max=1; loop5(a, i, j, k); } if (max == 1) { j--; i++; } if (i < N - k) { a[i++][j] = temp++; max = 2; loop5(a, i, j, k); } if (max == 2) { i--; j--; max = 0; } loop5(a, i, j, k + 1); } } void main() { int a[N][N] = { 0 }; show(a); loop5(a, 0, 0, 0); show(a); system("pause"); }
这是原来的 我是想把他改成递归(新手 递归太差 所以想锻炼锻炼) void loop2(int(*a)[N])//while 循环 { int temp = 1; //i控制行,j控制列,k控制循环次数 算法:(N+1)/2 得到循环次数 int i = 0, j = 0, k = 0; while (k < (N + 1) / 2) { while (j < N - k)//左往右 { a[i][j++] = temp++; } j--; i++; while (i < N - k)//右往下 { a[i++][j] = temp++; } j--; i--; while (j >= k)//下往左 { a[i][j--] = temp++; } j++; i--; while (i > k)//左往上 { a[i--][j] = temp++; } i++; j++; k++; } show(a); }
「已注销」 2016-08-12
  • 打赏
  • 举报
回复
你这个是C语言,循环里不可以加定义的.主函数里的实参数量比你设置的形参数量多
  • 打赏
  • 举报
回复
#define N 10

void show(int(*a)[N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%7d", a[i][j]);
}
printf("\n");
}
}

void loop5(int(*a)[N], int i, int j, int k)
{
static max = 0;
static temp = 1;
if (k>=(N+1)/2)
{
return;
}
else
{
if (j < N - k)
{
a[i][j++] = temp++;
max=1;
loop5(a, i, j, k);
}
if (max == 1)
{
j--;
i++;
}

if (i < N - k)
{
a[i++][j] = temp++;
max = 2;
loop5(a, i, j, k);
}
if (max == 2)
{
i--;
j--;
max = 0;
}
loop5(a, i, j, k + 1);
}

}


void main()
{
int a[N][N] = { 0 };
show(a);
loop5(a, 0, 0, 0);
show(a);
system("pause");
}

「已注销」 2016-08-12
  • 打赏
  • 举报
回复
你的提示错误是什么?我初步看了一下,感觉你的递归有点错误,你的递归终止条件是什么?是k么?可是你的k的值没变啊。
  • 打赏
  • 举报
回复
你这个递归函数要干嘛? 1 2 3 4 5 6 7 8 9 18 17 ·····································10 ················ 这样的数列?
  • 打赏
  • 举报
回复
引用 楼主 libinden71 的回复:
#define N 10 void show(int(*a)[N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%3d", a[i][j]); } printf("\n"); } } void loop5(int(*a)[N], int i, int j, int k) { static max = 0; static temp = 1; if (k>=(N+1)/2) { return; } else { if (j < N - k) { a[i][j++] = temp++; max=1; return loop5(a, i, j, k); } if (max == 1) { j--; i++; } if (i < N - k) { a[i++][j] = temp++; max = 2; return loop5(a, i, j, k); } if (max == 2) { i--; j--; max = 0; } // if (j >= k) // { // a[i][j] = temp++; // max = 3; // return loop5(a, i, j - 1, k); // } // if (max == 3) // { // j++; // i--; // max = 0; // } // // // if (i > k) // { // a[i][j] = temp++; // max = 4; // return loop5(a, i - 1, j, k); // } // if (max == 4) // { // i++; // j++; // max = 0; // } return loop5(a, i, j, k + 1); } } void main() { int a[N][N] = { 0 }; loop5(a, 0, 0, 0, 0); show(a); system("pause"); } 里面的4段递归,前面2段 显示是正确,后面这2段 不知道为什么一起运行就错误,求大神帮忙看看 哪里错了?还是说整个递归本来就有问题 只是我没发现?
loop5 的函数没有定义返回值但是过程总有return loop5
张小飞Official 2016-08-12
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。 “给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
赵老师的风格
paschen 2016-08-12
  • 打赏
  • 举报
回复
你代码没帮你调试,初步看了下 loop5 不是只有4个参数,为何主函数中调用时有5个参数 其次是提示什么错误,检查是否递归太深导致栈溢出
小灸舞 版主 2016-08-12
  • 打赏
  • 举报
回复
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧