经过一系列的学习,我们已经学会了创建和使用函数,在这个过程当中我们知道函数是可以相互调用的,那么,函数可不可以调用自己呢?这就是我们今天要学习的内容
1.什么是递归
递归是一种解决问题的思想,它是一种将大事化小,小事化了的思想,将一个复杂庞大的问题分解,找到一个可以重复的过程,并设置结束的标志,就可以将问题简单化。
那生活中的事情举个例子:要我们计算n!在n很大时可能不能一下子将这个数计算出来,而通过递归的思想就可以很好地解决问题。虽然我们不知道n!但我们知道它等于(n-1)!*n,经过这样一个过程我们就把一个题化简了一点点。之后就可以比葫芦画瓢,将这个问题一步步拆解,最后就把所有的!符号去掉了,只剩下数据的相乘计算。
就像给你一个洋葱要求你取出洋葱心一样,你需要一层一层地剥,才能最终解决问题,这就是递归的神奇
将其转换成代码就可以写成这样
#include <stdio.h>
int cal(int n)
{
if(n==1)
return 1;
else
return n*cal(n-1);
}
int main()
{
int n = 0;
scanf("%d",&n);
int res = cal(n);
printf("%d",res);
return 0;
}
2.递归的限制条件
经过上面的例子,大家就可以试着分析可以用递归解决的问题的特点,并以此推出递归的限制条件了。
1.递归会在一定条件下停下来
2.在每一次递归调用过后,需要逼近递归停止的那个条件
这样的两个条件其实很好理解,既然要解决问题,那我们肯定需要递归结束的条件标志着问题的解决,而每一次逼近那个条件才会让我们不会离目标背道而驰
3.递归与迭代
递归解决问题这么方便,那么有没有什么弊端呢?
有的兄弟,有的,在进行递归操作时,计算机会一层一层地调用函数,这时产生的数据是很庞大的,呈现指数型增长的趋势,简单来说就是很占用内存。
而迭代就是我们所说的循环,一般上来讲对于空间的占用少,计算快,在这方面就占据优势,但显然不如递归书写出的代码简洁
最直观的比较:
拿计算斐波那契数列第n位的数字大小来说,使用递归的方法,每一次递归调用都会需要前面两次的数据,这样,数据就会以2指数倍增长。
相反如果是迭代或者说循环,只需要创建2个变量,让他们通过加减不断赋值就可以达到目标,占用的内存也大大缩小
这就是迭代和递归的最大区别
好了那么今天的内容就讲到这里,之后会将数据在计算机中的储存方式,让我们更好地理解计算机是如何读取,改写数据的