多语言展示
当前在线:739今日阅读:99今日分享:20

玩转嵌入式[3]:递归算法

身边周围的学编程的人都觉得递归算法很难,不会用。我们起初学C语言的讲到递归算法时候,都会学到斐波那契数列递归算法和汉诺塔递归算法,都是比较典型的递归算法例子,而后者的递归运用,堪称优美,简洁可读性好。
工具/原料
1

Ubuntu操作系统

2

PC机

方法/步骤
1

不多说先贴程序上来看一下,通过这两个程序,可以看到用递归算法写出来的函数是多么的简洁而又优美,递归算法用问题本身定义问题,最后解决问题。

2

递归算法到底是什么东东呢?那就是在一个被定义函数中又直接地调用该函数本身,即函数自身的调用,就是这么简单。明白了函数的自身调用,那又怎么使用递归算法呢?通过上面的两个程序可以找出它们的共同点:①有明确的终止条件即结束的出口;②每次函数的自身调用都会接近终止条件。

3

递归算法的写法就好像是数学意义上的分段函数。以斐波那契数列递归算法为例,斐波那契数就是一个数列,它们的每一个数都是上两个数之和,用公式表达可为

4

可以看到从F0=0,F1=1,F(n)=F(n-1)+F(n-2)(n >= 2),由此要想知道F(n)的值就是要求出F(n-1)+F(n-2), 以此类推。用if判断语句来分段出“边界”条件(n<=1)和“非边界”条件,当未达到“边界”条件时那就继续调用自身(递归条件),当递归到满足基本条件(达到了“边界”),就不需要再递归了,然后把结果返回给上一层。因为不停地调用很多次自身,肯定有很多层。从F(1)、F(2)开始一层一层的返回,到最后就能算出F(n)的答案了,是不是很神奇呢。那知道原理方法了,应该怎么写程序呢?一张图教你怎么写!!!

5

再说回上面斐波那契数列递归算法这个函数,除非n=1或n=2(结束条件),否则,就得一直调用自身(递归)然后求出F(n)的函数值。为什么要结束条件呢?因为没有结束条件就会不断地递归,直到栈溢出。你可以先写递归结束条件,以本例斐波那契数列递归算法结束到n=1或n=2结束递归,然后再写递归调用函数,因为斐波那契数是上两个数之和就可以推出递归使用,即用return返回F(n-1)+F(n-2)即就是返回F(n)的值,以此类推直到递归到结束条件成立。

注意事项
1

递归会减慢程序的效率(对程序现场的反复保护)需要大量的时间和空间进行出栈和入栈的操作;

2

为了使得程序简洁(任何递归都可以使用非递归的方式实现,比如使用迭代算法);

3

递归调用会使局部变量增大,不断开辟栈区,需要注意栈溢出的问题;

4

更多好玩的有趣的经验加关注分享给你。

推荐信息