算法之---递推与递归

来源:互联网 发布:商场导航软件 编辑:程序博客网 时间:2024/04/28 18:59

递推的概念与基本思想:

    给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。

递推定义

   递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。

 递推算法分为顺推和逆推两种。

顺推法

  所谓顺推法是从已知条件出发,逐步推算出要解决的问题的方法叫顺推。

  如斐波拉契数列,设它的函数为f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。则我们通过顺推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我们要求的解。

逆推法

  所谓逆推法从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为逆推。

递归算法

  递归过程一般通过函数或子过程来实现。递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。

递归算法的特点

  递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

  递归算法解决问题的特点:

  (1) 递归就是在过程或函数里调用自身。

  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

递归算法要求

  递归算法所体现的“重复”一般有三个要求:

  一是每次调用在规模上都有所缩小(通常是减半);

  二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);

  三是在问题的规模极小时必须用直接给出解答而不再进行递归调用因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

 

 推与递归的比较 

  相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值.

  比如阶乘函数:f(n)=n*f(n-1)

  在f(3)的运算过程中,递归的数据流动过程如下:

  f(3){f(i)=f(i-1)*i}-->f(2)-->f(1)-->f(0){f(0)=1}-->f(1)-->f(2)--f(3){f(3)=6}

  而递推如下:

  f(0)-->f(1)-->f(2)-->f(3)

  由此可见,递推的效率要高一些,在可能的情况下应尽量使用递推.但是递归作为比较基础的算法,它的作用不能忽视.所以,在把握这两种算法的时候应该特别注意。

 

例子:

1.斐波那契数列算法,如:1,1,2,3,5,8,13,21…… ,可以看到这里面的规律吧.就是每一项是前面相邻两项之和.求第N项。

  递推算法:

  public static int Sum(int n)        {            if (n < 1)            {                return 0;            }            if (n == 1 || n == 2)            {                return 1;            }            int M = 0;            int M1 = 1;            int M2 = 1;            for (int i = 3; i <= n; i++)            {                M = M1 + M2;                M1 = M2;                M2 = M;            }            return M;        }

求第100项的值是,

  时间为瞬间完成。

递归算法:

 public static int Sum1(int n)        {            if (n < 1)            {                return 0;            }            if (n == 1 || n == 2)            {                return 1;            }            return Sum1(n - 1) + Sum1(n - 2);        }


求第100项的值是:电脑卡死,CPU为100%

可见递归算法的效率是多低。


 

 

原创粉丝点击