首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

-怎么学习与理解递归?

2012-06-03 
求救----如何学习与理解递归???自己正在学习数据结构递归这块,感觉到难度很大,请教高手谈谈自己怎样学习与

求救----如何学习与理解递归???
自己正在学习数据结构递归这块,感觉到难度很大,请教高手谈谈自己怎样学习与理解递归,再到自己设计递归

[解决办法]
多接触一些实例,在解决问题(或者看别人的解决方案)的过程中体会解决问题的思路和方法,通过实践慢慢理解。光靠理论的讲解是没有用处的。

比较经典的递归实例:汉诺塔(Google一下)、背包问题(也可以动归解决)
[解决办法]
说实话我也是刚会递归没多长时间,但这东西一旦会用了,就会觉得特别好用,
可以让代码简洁又明确,现在有不少程序,我只会用递归写,换成别的方法,我反而不会了。
[解决办法]
就是多次调用自身啊,本身一个大的问题n层次的,化解为单个的小问题依次到n-1……等等到1结束,像汉诺塔问题就是,还有像树的前序和后序遍历也是。。。多找些着方面的资料吧
[解决办法]
多看多理解就好啦。
给你个数独的算法。
用的递归。
数据结构里面用的很多哦。

C/C++ code
#include  <stdio.h> 

int map[9][9] = {0, 0, 3, 8, 1, 0, 0, 0, 9,
        5, 0, 0, 4, 0, 0, 0, 8, 0,
        0, 6, 0, 9, 0, 0, 1, 0, 0,
        0, 0, 8, 0, 3, 0, 0, 0, 6,
        0, 0, 0, 0, 0, 0, 0, 0, 0,
        9, 0, 0, 6, 0, 0, 5, 0, 0,
        0, 0, 6, 0, 0, 9, 0, 1, 0,
        0, 1, 0, 0, 0, 5, 0, 0, 4,
        2, 0, 0, 0, 4, 8, 7, 0, 0};

void display()
{
  int i;
  int j;
  for (i = 0; i < 9; i++)
  {
    for (j = 0; j < 9; j++)
    {
      if(map[i][j])
      {
        printf(" < %d > ", map[i][j]);
      }
      else
      {
        printf(" <  > ");
      }
    }
    printf("\n");
  }
}

int check(int x, int y, int *mark)//这段程序有俩个功能。一是求当前空的位置可以填的数v                      //有多少选择。二是都是哪些数。
{
  int i;
  int j;
  int gi;
  int gj;
  int count = 0;

  for (i = 1; i <= 9; i++)
  {
    mark[i] = 0;
  }

  for (i = 0; i < 9; i++)
  {
    mark[map[x][i]] = 1;
    mark[map[i][y]] = 1;
  }

  gi = x / 3 * 3;//这是限制后面两个for的条件.

            //因为要求每个小9格也不能重复g i由于是 int型的除法。
  gj = y / 3 * 3;//去除余数。0,1,2相当于0.3,4,5,相当于3.

            //这样求出每个小九格相对的位置。

  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 3; j++)
    {
      mark[map[gi + i][gj + j]] = 1;
    }
  }

  for (i = 1; i <= 9; i++)//算出每个空位置缺少多少个数。
  {
    if(0 == mark[i])
    {
      count++;
    }
  }

  return count;
}

void crack()
{
  int i;
  int j;
  int mark[10];
  int min = 10;
  int ci = -1;
  int cj;

  for (i = 0; i < 9; i++)
  {
    for (j = 0; j < 9; j++)
    {
      if(map[i][j])
      {
        continue;//如果存在。就跳过后面代码。j++.
      }
      int c = check(i, j, mark);//求出每个空位置可以填多少个元素。

      if (0 == c)
      {


        return;//这个是递归函数。判断填入的数时候符合。不符合跳到上层。
      }

      if (c < min)//判断是否把空的位置都填满了。如果填满的话。ci=-1。
      {
        ci = i;
        cj = j;
        min = c;
      }
    }
  }
  if (-1 == ci)//所有位置都填满的话。输出。
  {
    printf("The answer is:\n");
    display();
    return;
  }

  check(ci, cj, mark);//计算当前位置可以填入哪些数。
  for (i = 0; i <=9; i++)
  {
    if (mark[i] == 0)//当前位置可以填入的数。按从小到达的顺序去试。
    {
      map[ci][cj] = i;//填入数。
      crack();//递归调用。判断是否满足。如果满足。

          //则找到所需数第二少的空位置。做循环。

          //如果不满足。就跳出。填入第二顺位的数。
          //如果都满足的话。ci=-1.输出显示。

    }       
    map[ci][cj] = 0;
  }
}
int main()
{
  printf("The game is:\n");
  display();

  crack();

  return 0;
}


热点排行