算法设计之递归法(2)

导读:
  <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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值