认识递归

大家好,今天我们来学习一下(包括但不限于)C语言里面的一种常见函数(算法),那就是递归。它是一种非常巧妙的算法,可以解决一些一般的算法难以解决的问题,它的效率可能不是最高的,但是它可以成功地让复杂的问题简单化,直观化,非常清晰明了。那么一起来了解一下吧。

递归函数的定义很简单:调用自身的函数称为递归函数。展开了讲,就是一个函数第一次调用自身,没能解决问题,第二次调用,同样没有解决问题,别灰心,还有第三次,第四次......直到能够成功解决问题的那一次,才停止调用函数。这里讲得可能有些抽象,看得可能云里雾里,不要紧,大家可以看完例子之后再回来咀嚼这一段话,可能就会比现在理解得要好一些。

先看一个简单一点的题:求1+2+3+...+100的值。

有人说:我会!高斯求和!我立刻给你一脚。如果用高斯求和来写这个算法,时间效率固然是最高的,但是如果没有人教过你高斯求和呢?从1加到100反复验算到明天早上吗?这显然是不合理的。大家能够静下心来读我的文章,要么是正在学计算机的学生,要么就是计算机的爱好者,因此我们要充分利用计算机的优势,让问题变得简单化。

int sum_rec(int n){
	if(n==1)return 1;//递归出口
	else return n+sum_rec(n-1);//递归关系
}

这是实现这个算法所用到的函数,它的函数体由两个部分组成,一个是递归出口,一个是递归关系。递归关系可以说就是我们高中数学常见的递推式,通过递归关系,函数会不停地调用自身,直到找到结果。那么什么时候能找到结果呢?那就必须保证函数要有递归出口,如果没有递归出口,那么这个程序就会马不停蹄地调用自己,累死也停不下来了,听起来也是蛮吓人的。

想要了解这个函数,我们最好跟着程序走一下,才能体会到这个算法的真谛。现在,请大家闭上眼睛,心静下来,把自己就想象成一台计算机。现在我就是一台计算机,如果我是计算机,我会怎么用这个函数去算1到100这样一串数的和呢?我们就把n设定为4好了,这样简单,又便于发现规律。把4传进形式参数n,首先判断n是不是1,不是!那么就就返回4+sum_rec(3),那么rec_sum(3)又是多少呢?首先,3≠1,所以函数返回3+sum_rec(2)。结束了吗?不可能,sum_rec(2)还没算出来呢,它等于多少?2≠1,所以返回2+sum_rec(1)。再算sum_rec(1),这时n终于等于1了,所以sum_rec(1)的值就是1。终于把最源头的答案找到了。递归递归,刚刚我们做的是"递",现在轮到"归"了。既然sum_rec(1)是1,那么sum_rec(2)就是2+sum_rec(1),也就是3。接着,sum_rec(3)就是3+sum_rec(2)=6。再接着,sum_rec(4)就是4+sum_rec(3),也就是10,所以这个函数的最终返回值就是10,我们再来验算一下,1+2+3+4的结果果然是10。

此时,配一张图或许会让你们更进一步理解计算机的运行流程:

现在再回去看我的那段话,是不是清晰了很多呢?

给大家出一个小题吧,看看你掌握了多少。请你编写一个函数计算n!。

你有什么智慧之光?欢迎留言交流!

发布了7 篇原创文章 · 获赞 5 · 访问量 155

猜你喜欢

转载自blog.csdn.net/weixin_45264145/article/details/104756053