#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段 不知道为什么一起运行就错误,求高手帮看看 哪里错了?还是说整个递归本来就有问题 只是本人没发现?
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段 不知道为什么一起运行就错误,求高手帮看看 哪里错了?还是说整个递归本来就有问题 只是本人没发现?
解决方案
2
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
18
5
5
#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 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”);
}