导读:
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
递归和非递归的转换
在第一讲《算法设计之枚举法》中我们有一道练习题:
例6:构造一个3*3的魔方:把数字1-9添入如图的表格中
2 7 6
9 5 1
4 3 8
要求每横,竖,斜列之和均相等(如图是一种情况)。输出所有可能的魔方。
当时我们是使用枚举法解的,通过剪枝等优化后得到一个8重嵌套循环,而且每个循环的结构都是一样的,既繁琐,又复杂。既然如此,那么我们是否可以用一个递归函数来实现呢?答案是肯定的。程序如下:
#include
#define MAX 9
int IsElement(int a[], int len, int x);
void F(int a[], int len);
int main()
{
int a[MAX] = {0};
int i;
for (a[0]=1; a[0]<=MAX; a[0]++)
{
F(a, 0);
}
getchar();
return 0;
}
void F(int a[], int len)//以递归代替多重嵌套循环
{
int i;
if (len
{
len++;
for (a[len]=1; a[len]<=9; a[len]++)
{
F(a, len);
}
}
else if (len == MAX-2)
{
a[8] = 45-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7];
if ((a[0]+a[1]+a[2]) == (a[3]+a[4]+a[5]) &&(a[0]+a[1]+a[2]) == (a[6]+a[7]+a[8])
&&(a[0]+a[3]+a[6]) == (a[1]+a[4]+a[7]) &&(a[0]+a[3]+a[6]) == (a[2]+a[5]+a[8])
&&(a[0]+a[1]+a[2]) == (a[0]+a[4]+a[8]) &&(a[0]+a[1]+a[2]) == (a[2]+a[4]+a[6]))
{
for (i=0; i<9; i++)
{
printf("%5d", a[i]);
if ((i+1)%3 == 0)
printf("/n");
}
printf("/n/n");
}
}
}
int IsElement(int a[], int len, int x)
{
int i;
for (i=0; i
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
递归和非递归的转换
在第一讲《算法设计之枚举法》中我们有一道练习题:
例6:构造一个3*3的魔方:把数字1-9添入如图的表格中
2 7 6
9 5 1
4 3 8
要求每横,竖,斜列之和均相等(如图是一种情况)。输出所有可能的魔方。
当时我们是使用枚举法解的,通过剪枝等优化后得到一个8重嵌套循环,而且每个循环的结构都是一样的,既繁琐,又复杂。既然如此,那么我们是否可以用一个递归函数来实现呢?答案是肯定的。程序如下:
#include
#define MAX 9
int IsElement(int a[], int len, int x);
void F(int a[], int len);
int main()
{
int a[MAX] = {0};
int i;
for (a[0]=1; a[0]<=MAX; a[0]++)
{
F(a, 0);
}
getchar();
return 0;
}
void F(int a[], int len)//以递归代替多重嵌套循环
{
int i;
if (len
{
len++;
for (a[len]=1; a[len]<=9; a[len]++)
{
F(a, len);
}
}
else if (len == MAX-2)
{
a[8] = 45-a[0]-a[1]-a[2]-a[3]-a[4]-a[5]-a[6]-a[7];
if ((a[0]+a[1]+a[2]) == (a[3]+a[4]+a[5]) &&(a[0]+a[1]+a[2]) == (a[6]+a[7]+a[8])
&&(a[0]+a[3]+a[6]) == (a[1]+a[4]+a[7]) &&(a[0]+a[3]+a[6]) == (a[2]+a[5]+a[8])
&&(a[0]+a[1]+a[2]) == (a[0]+a[4]+a[8]) &&(a[0]+a[1]+a[2]) == (a[2]+a[4]+a[6]))
{
for (i=0; i<9; i++)
{
printf("%5d", a[i]);
if ((i+1)%3 == 0)
printf("/n");
}
printf("/n/n");
}
}
}
int IsElement(int a[], int len, int x)
{
int i;
for (i=0; i