1. 递归
1.1 什么是递归
所谓的递归就是在求解的过程中,函数在不停地自己调用自己解决问题。但是在实际的变成过程中能用迭代操作的就不要用递归进行操作(比如说 for 循环就是一种常见的递归方式),以为循环相当于知根知底,我们知道程序会在什么样的情况下停止,但是递归不能。所以有的时候我们也可以将本应该应用递归求解的过程转化为用迭代进行求解。
在高级语言中,函数自己调用和调用其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。不过,写递归程序最怕的就是陷入永不结束的无穷递归中。切记,每个递归定义必须至少有一个条件,当满足这个条件时递归不再进行,即函数不再调用自身而是返回值。
使用递归能使程序的结构更清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但大量的递归调用会建立函数的副本,会消耗大量的时间和内存,而迭代则不需要此种付出。递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。
1.2 斐波那契数列
兔子数列是递归思想的一种典型的应用,如下图所示
1.2.1 使用迭代方法实现
使用迭代的方法的源代码如下,代码的过程就是按照上面的说明顺序执行的,浅显易懂
#include <stdio.h>
int main()
{
int i;
int a[40];
a[0] = 0;
a[1] = 1;
printf("%d %d ", a[0], a[1]);
for( i=2; i <