新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
成都创新互联公司长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为龙华企业提供专业的成都做网站、网站制作、成都外贸网站建设,龙华网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
扩展资料:
递归的应用
1、数据的定义是按递归定义的。(Fibonacci函数)
2、问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
3、数据的结构形式是按递归定义的。
递归的缺点
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
参考资料来源:百度百科-递归
递归:就是自己调自己,但是没终止条件会死循环,所以你的递归代码里有结束自调自的条件,这样就创造了有限次的循环(代码中你看不到for或foreach但是有循环发生)
所谓递归,说的简单点,就是函数自己调用自己,然后在某个特定条件下。结束这种自我调用。
如果不给予这个结束条件,就成了无限死循环了。这样这个递归也就毫无意义了。
如下面问题
1 1 2 3 5 8 13 21 ........n
分析可以看出, i 表示第几个数, n 表示该数的值
当i = 1 时, n = 1;
当i = 2 时, n = 1;
当i = 3 时 n = i1 + i2;
当i = 4 时 n = i2 + i3
所以可以写个函数
int fun(int n) // 这里的n代表第几个数
{
if(1 == n || 2 == n) // 第一个数
{
return 1;
}
else
{
return fun(n - 1) + fun(n - 2); // 这里就是自己调用自己,形成循环自我调用。
}
}
注: 以上代码只是用来演示递归,不包含错误校验。
在实际生产过程中。该代码不够健壮。
如此,就完成了递归。你就可以求得第n个数了。
何时考虑使用递归。
当你分析一个问题的时候,发现这个问题,是一个自我循环时,而且这个自我循环到一个给定值,就可以终止的时候,你就快要考虑递归了。
#includestdio.h
int account_next(int a[][8], int m, int n)
{
// 列索引n执行+1,即进入下一列
if (-1 = n n != 8)
n++;
// 当列索引n至最后一列时(n=8),行索引m执行+1,即进入下一行
else if (-1 = m m != 8)
{
n = 0;
m++;
}
// 当行索引=8时,说明已经遍历全部元素
else
return 0;
if (0 = m m 8 0 = n n 8 a[m][n] == 0)
{
// 计数a[m][n]左、右、上、下、左上、左下、右上、右下1的个数
int c = 0;
// left
if (0 n 1 == a[m][n - 1]) c++;
// right
if (7 n 1 == a[m][n + 1]) c++;
// up
if (0 m 1 == a[m - 1][n]) c++;
// down
if (7 m 1 == a[m + 1][n]) c++;
// left up
if (0 m 0 n 1 == a[m - 1][n - 1]) c++;
// left down
if (7 m 0 n 1 == a[m + 1][n - 1]) c++;
// right up
if (0 m 7 n 1 == a[m - 1][n + 1]) c++;
// right down
if (7 m 7 n 1 == a[m + 1][n + 1]) c++;
printf("a[ %d ][ %d ] 周围有 %d 个1.\n", m, n, c);
}
// 计数a[m][n]下一个元素
account_next(a, m, n);
}
int main(void)
{
int a[8][8] = {
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 1, 1 },
{ 1, 1, 1, 0, 0, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 0, 1 },
{ 1, 1, 0, 0, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 } };
account_next(a, 0, -1);
return 0;
}
循环与递归的本质区别在于内存的使用上,递归是方法调用方法本身,而随着递归的次数的增加,内存的消耗也是不断增长,而在我们写代码时,内存是一个很重要的部分,我们尽量都是减少内存的消耗,以免造成对系统资源的浪费,循环占用的内存很少,每次循环都会释放之前分配的内存,但是很多递归的功能是不能用循环实现的,这就要考虑你要实现的功能了,如果非递归不可完成的功能,我们也不会刻意更改。