零基础小白必学C语言经典算法之一—递归算法

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.结束语

现在的程序设计追求的就是可读性好,递归的算法看起来简洁。随着计算机性能的不断提高,程序在更多的场合是优先考虑可读性,因此,如果可以,鼓励使用递归优先实现程序思想。

每天进步一点点,每天消化一点点。如果你有更高的想法,欢迎一起交流。如果觉得文章写得还不错,点个赞呗。

你可能感兴趣的:(零基础小白必学C语言经典算法之一—递归算法)