分享

再谈递归思想_随风的个人空间

 芝诺 2008-11-19
2008-09-19 21:31

最显然的情况是直接递归,即在函数中直接显式地调用它本身。我们来看一个简单的关于递归的例子:

f(int n)
{
    ...
   
f(n/2);
    ...
}

另外的情形是, 一个函数调用另一个函数, 它又返过来调用第一个函数。这种情形称为间接递归。例如:

a(int n)
{
       ...
      
b(n/3);
       ...
}
b(int n)
{
      ...
     
a(n/2);
      ...
}

对于不熟悉递归的用户, 它看起来似乎是错误定义的和危险的循环。有人认为这种程序可能在永不终止的函数调用序列中循环。当然, 这是可能的, 但这只是在函数定义不正确时才会发生。

对程序而言, 递归函数的目的是执行一系列调用, 一直到达某一点, 序列终止。

为了保证递归函数是正常执行的, 你应该遵守下面的规则:

    1. 每次当一个递归函数被调用时, 程序首先应该检查其些基本的条件是否满足了, 例如某个参数的值等于零, 如果是这种情形, 函数应停止递归。

    2. 每次当函数被递归调用时, 传递给函数一个或多个参数, 应该以某种方式变得"更简单"。即, 这些参数应该逐渐靠近上述基本条件。例如, 一个正整数在每次递归调用时会逐渐变小, 以至最终其值能到达零。

下面, 我们将用一个广为人知的例子----阶乘函数来说明这些规则。

阶乘函数是按照递推关系式来定义的:
f(0) = 1
f(n) = n * f(n-1) (n>0)

这个定义很快说明了如何用 C 语言来编写一个能满足这两个条件的阶乘函数。

int f(int n)
{
    if (n==0)
        return(1);
    else
       return(n * f(n-1));
}

注意这个程序是如何遵循上面两条规则的。

如果基本条件, 即参数等于零满足的话, 递归就终止了。
如果这个条件不满足, 函数每次递归传送一个比上一次更小的参数给被调用函数。最终参数值将为零, 正好满足终止条件。

让我们看一下 n=3 时阶乘函数执行的情况。

返回页首

C 语言中的函数可以直接或间接地调用其本身, 这和其它语言不同。它为程序员带来了极大的灵活性。

2.递归和迭代

尽管阶乘函数是说明递归过程的一个很好的例子, 但实际上用非递归的过程迭代来解决会更好些。迭代只是一个代码块的重复执行, 而执行的次数则由块中的局部变量来控制。

C语言提供了 for, while, 和 do 这些构造来实现迭代循环的结构。当然, 带标号的 goto 语句也可以用, 但实际上通常不怎么用它, 因为它是非结构化的, 而且它会使控制流变得难以理解。

为了把一个递归方法转换为一个迭代方法, 通常要求引入一个或多个的局部变量, 用来计数或者控制这个过程。请再来看一看阶乘函数的例子:

递归方法 迭代方法
f(n) = n * f(n-1)
f(0) = 1
f(n) = n * (n-1) * ... * 1
f(0) = 1

递归方法:
int f(int n)
{
    if (n==0)
        return(1);
    else
        return(n*f(n-1));
}

迭代方法:
int f_it(int n)
{
    int count, result;        <---引进两个局部变量 count 和 result
    for (count=result=1; count<=n; ++count)         <---迭代循环
        result *= count;
    return(result);             <---返回到调用程序
}

迭代方法比递归方法快, 因为迭代避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销。

递归和迭代之间的选择。一般情况下, 当迭代方法比较容易找到时, 你应该避免使用递归。这在问题可以按照一个递推关系式来描述时, 是时常遇到的, 比如阶乘问题就是这种情况。 反过来, 当很难建立一个迭代方法时, 递归就是很好的方法。实际上, 在某些情形下, 递归方法总是显而易见的, 而迭代方法却相当难找到。当某些问题的底层数据结构本身就是递归时, 则递归也就是最好的方法了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多