第一章 导论

递归简论

大多数数学公式都是又一个简单的函数描述的。例如:

C = 5(F - 32) / 9
温度转换

但有的时候会有这种情况

定义一个函数F,满足F(0)= 0, 且F(X)= 2F(X - 1) + X^2

这个函数用它自己来定义的时候就叫做递归(recursive),下面代码指出F的递归实现。

int F(int X)
{
    if (X == 0)                         
        return 0;
    else
        return 2 *F(X - 1) + X * X;
}

假设当你计算F(4)的时候,实际上是计算F(3)+4×4,这样就需要调用F(3), 计算F(3)的时候需要调用F(2),直到调用F(0)= 0.

必须注意的是,递归调用将反复进行到直到基准情形出现为止。例如计算F(-1)的值将导致调用F(-2),F(-3)等,这种情况下不可能出现基准情形,所以系统无法算出答案。

递归函数还有一个需要注意的问题是:定义计算不出来,例如:

int BAD(int X)
{
    if (X == 0)                         
        return 0;
    else
        return BAD(X / 3 + 1) + X - 1;
}

这种错误就是将BAD(1)定义为BAD(1),计算机会反复调用BAD(1),导致计算不出来。 因此递归需要两个基本法则:

  1. 基准情形(base case):你必须重要有某些基准情形,他们不用递归就能求解。
  2. 不断推进(making progress):对于那些需要递归求解的情形,递归调用必须能够朝着产生基准情形的方向推进。
  3. 设计法则(design rule): 当设计递归程序的时候没有必要知道管理的细节,不必试图追踪大量的递归调用。
  4. 合成效益法则(compound interest rule):会在以后给予讲解。

总结

着一章为其余部分建立了一个舞台。对于面临大量输入的算法,他所花费的时间是一个判别其好坏的重要标准,我们将在下一章讲述这些问题。并将用这里讨论的数学概念建立一个正式的模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值