求救----如何学习与理解递归???
自己正在学习数据结构递归这块,感觉到难度很大,请教高手谈谈自己怎样学习与理解递归,再到自己设计递归
[解决办法]
多接触一些实例,在解决问题(或者看别人的解决方案)的过程中体会解决问题的思路和方法,通过实践慢慢理解。光靠理论的讲解是没有用处的。
比较经典的递归实例:汉诺塔(Google一下)、背包问题(也可以动归解决)
[解决办法]
说实话我也是刚会递归没多长时间,但这东西一旦会用了,就会觉得特别好用,
可以让代码简洁又明确,现在有不少程序,我只会用递归写,换成别的方法,我反而不会了。
[解决办法]
就是多次调用自身啊,本身一个大的问题n层次的,化解为单个的小问题依次到n-1……等等到1结束,像汉诺塔问题就是,还有像树的前序和后序遍历也是。。。多找些着方面的资料吧
[解决办法]
多看多理解就好啦。
给你个数独的算法。
用的递归。
数据结构里面用的很多哦。
#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;
}