文档介绍:数据结构论文——递归算法的讨论
所谓递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调 用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身, 这种过程(或函数)叫递归过程(或函数)。递归过程一般通过函数或子过程来实 现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。递归 算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算 法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。递 归算法解决问题的特点:
递归就是在过程或函数里调用自身。
在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。
在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。 递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。下面就 让我们结合例子详细讨论一下递归算法。
一、 递归算法的原理
递归算法简单的说就是在函数中调用函数自身,不断调用,直到满足函数得 出计算结果(某个条件)。因为其需要不断循环的调用自身,所以称为递归调用。 递归的原理,其实就是一个栈(stack),比如求5的阶乘,要知道5的阶乘,就要知 道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈,在 把4的入栈,直到最后一个,之后呢在从1开始出栈,看起来很麻烦,确实很麻烦, 他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行 效率出奇的慢。还有一个十分形象的例子:从前有座山,山里有个庙,庙里有个 老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从 前有座山,山里有个庙,庙里有个老和尚正在讲故事……如此循环往复到最终的 要求。
递归分为2种,直接递归和间接递归。直接递归,比如方法A内部调用方法 A自身。间接递归,比如方法A内部调用方法B,方法B内部调用方法C,方法C 内部调用方法A。递归做为一种算法在程序设计语言中广泛应用。一个过程或 函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复 杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需 少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代 码量。递归的能力在于用有限的语句来定义对象的无限集合。递归的三个条件: 边界条件、递归前进段、递归返回段。当边界条件不满足时,递归前进;当边界 条件满足时,递归返回。
二、 递归算法的用处
了解了递归算法的原理,那么什么时候需要用到递归算法呢?①问题的定义 是递归的。有许多数学公式、数列的定义是递归的,例如求n!和Fibonacci数 列等。这些问题的求解的过程可以将其递归定义直接转化为对应的递归算法。
例如阶乘函数的定义
当n=0时
n!=
n*(n-l)*"*-*l 当 n>0 时
这时候递归的定义可以用如下的函数表示:
1 当n=0时
f (n) =
n*f(n-1) 当 n>0 时
也就是说,函数f(n)的定义用到了自己本身f (n—1) o
②数据结构是递归的。
有些数据结构是递归的。例如,第2章中介绍过的单链表就是一种递归数据结构, 其结点类型定义如下:
typedef stru