程序调用自身的编程技巧称为递归。
递归作为一种算法在程序设计中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归的三个条件:
- 能够将一个问题转换成为一个新问题,并且新问题的解法和原来问题的解法类同或者相同,不同的仅是处理对象,且处理对象有一定依据。
- 可以通过上述转化使问题一步步简化。
- 有明确的递归出口,或者说叫递归边界。
以斐波那契数列为例,斐波那契数列是从第三个元素开始每一个元素都是前两个元素相加,这种模式就符合程序递归调用的条件。
首先:假设我们求第10个斐波那契数列,就一定要知道第9和第8个,同理回溯到第一和第二个元素,我们可以发现:要解决求第10个斐波那契数的问题就一定要解决第9和第8个,这就分解成了和原问题相似的小问题,之后一步步分解下去,就回到了我们的第一个和第二个元素 1 .这就满足了递归的第一个条件。
第二:每一次将问题分解转化,我们得到的问题就离第一和第二个元素越接近,也就越简单,这就满足第二个条件。
第三:递归的出口就是10的次数减到1和2即可,因为在数列中1和2是特殊的,被直接定义为1,大致意思可以在代码上理解:
#include<stdio.h>
int Fib(int x) {
if (x == 1)return 1;
if (x == 2) return 1;
return Fib(x - 1) + Fib(x - 2);
}
void main() {
int num;
printf("求第几位斐波那契数: ");
scanf("%d", &num);
printf("%d\n", Fib(num));
}