递归简论
大多数数学公式都是又一个简单的函数描述的。例如:
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),导致计算不出来。 因此递归需要两个基本法则:
基准情形(base case):你必须重要有某些基准情形,他们不用递归就能求解。
不断推进(making progress):对于那些需要递归求解的情形,递归调用必须能够朝着产生基准情形的方向推进。
设计法则(design rule): 当设计递归程序的时候没有必要知道管理的细节,不必试图追踪大量的递归调用。
合成效益法则(compound interest rule):会在以后给予讲解。
总结
着一章为其余部分建立了一个舞台。对于面临大量输入的算法,他所花费的时间是一个判别其好坏的重要标准,我们将在下一章讲述这些问题。并将用这里讨论的数学概念建立一个正式的模型。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。