1.递归
一个函数自己直接或间接调用自己。
思想就是:将问题规模不断缩小,化繁为简,求n!转化成(n-1)!,再转换成(n-2)!.......最后转换成(1)!.
有如汉诺塔问题,如果初始有10个砝码,要从A移动到C,这个看起来比较复杂。只要把前9个移动到B,然后移
动第10个到C。那这9个怎么移动呢,也用这种方式。。。这就是递归实现汉诺塔。
现在我们来看一个简单的递归算法:C语言实现汉诺塔
递归算法的精髓是一层入一层,直至遇到满足的结束语句,所以一般和递归在一起的是一些判断语句。递归函数得要有终止语句。
遇到递归问题需要根据规律解决。
(1)找到所谓的终止条件,即让递归停止的条件
(2)找到递推的关系式
(3)递归的方向要搞清楚,一般是向最终的终止条件不断递归
(4)递归 分为回推和递推两个阶段,当递推到终止条件时,程序会反向推回(回推)!!!!
用递归算法(recursion)计算阶乘
codes:
/**************************************
*author: Yang Xu
*goals: compute factorial by recursion
***************************************/
#include
#include
int main()
{
/*print the result of factorial*/
printf("%d\n", f(5));
system("pause");
return 0;
}
int f(int n)
{
int x;
/*这里就不加关于负整数的判断了*/
if(n==1||n==0)
x=1;
else
x=n*f(n-1);//the recursion
return x;
}
例题
有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?
程序分析:
利用递归的方法,递归分为回推和递推两个阶段。要想知道第5个人岁数,需知道第4人的岁数,依次类推,推到第1人(10岁),再往回推。
#include
/*
* 请使用递归函数完成本题
* 小编已将正确代码放在左侧任务的“不知道怎么办”里
* 小编希望各位童鞋独立完成哦~
*/
//定义一个函数,传送人员序号进去,返回该序号员工的年龄。
int getAge(numPeople)
{
//定义返回的年龄
int age;
//如果是第1个人的时候,年龄为10岁
if(numPeople==1)
age=10; //这是回推墙,也就是结束递归的条件。
else
//还没接触到回推墙,就自我调用,谓之递归。
age = getAge(numPeople-1)+2; //年龄等于上一个人的年龄加2
return age;
}
int main()
{
printf("第5个人的年龄是%d岁", getAge(5));
return 0;
}
小编推荐一个学C语言/C++的学习裙【 六四二,一二零,九一四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!学习更多C/C++相关知识也可以去公众号——“huainian_c”。
2. 善用递归:
使用递归有利有弊,有点自然是为某些问题提供了简单的解决办法,同时,代码看起来也很简洁;而缺点也不容忽视,很多递归会很快耗尽计算机的内部资源。分分钟电脑死机。
正因为如此,很多递归我们都可以使用非递归来代替,比如下面我们求两个整数的最大公约数:
3.结束语
现在的程序设计追求的就是可读性好,递归的算法看起来简洁。随着计算机性能的不断提高,程序在更多的场合是优先考虑可读性,因此,如果可以,鼓励使用递归优先实现程序思想。
每天进步一点点,每天消化一点点。如果你有更高的想法,欢迎一起交流。如果觉得文章写得还不错,点个赞呗。