递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。
顺推法:顾名思义,顺推法是指“从已知条件出发,逐步推算出要解决的问题”的方法。
这次就先介绍顺推法中的一个典型的例子,斐波那契数列。
题目:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子? 分析:我们不妨拿新出生的一对小兔子A分析一下: 一个月后小兔子A没有繁殖能力,所以还是一对(A); 两个月后,A生下一对小兔B,对数共有两对(A,B); 三个月以后,A又生下一对C,因为小兔子(B)还没有繁殖能力,所以一共是三对(A,B,C); ------ 依次类推可以列出下表:
(幼仔对数指1个月大的兔子,成兔对数指2个月大的兔子)
幼仔对数 = 前月成兔对数 成兔对数 = 前月成兔对数 + 前月幼仔对数 总体对数 = 本月成兔对数 + 本月幼仔对数 可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。即: 幼仔对数:前面相邻两项相加,得到后一项。 成兔对数:前面相邻两项相加,得到后一项。 总体对数:前面相邻两项相加,得到后一项。 这三个数列具有相同的通项公式: a(n+2) = an + a(n+1)。 题目所求为一年后可以繁殖多少对兔子,即求总体对数。下面给出具体代码: #include "stdafx.h" #include <iostream> using namespace std; #define NUM 13 //这里NUM为宏定义值13,代表rabbitCount数组长度为13 int _tmain(int argc, _TCHAR* argv[]) { long rabbitCount[NUM] = {}; //下标为0-12rabbitCount[0]为初始状态兔子总数量 rabbitCount[0] = 1; //rabbitCount[0]为初始状态兔子总数量,值为1 rabbitCount[1] = 1; //rabbitCount[1]为一个月后兔子总数量,值为1 for(int i = 2; i < NUM; i++){ //从第二月开始,到12月结束 rabbitCount[i] = rabbitCount[i - 1] + rabbitCount[i - 2]; } for (int i = 0; i < NUM; i++){ cout << "第"<< i <<"个月后兔子总数为:"<< rabbitCount[i] <<endl; } system("pause"); return 0; }扩展:一般遇到斐波那契数列的题目,并不是让我们计算原始的兔子题,而是在其基础上扩展的题目
斐波那契数列扩展题:斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
这个数列从第三项开始,每一项都等于前两项之和。
试着任意输入一个n值,输出其对于的斐波那契数列的值。
分析:与前面介绍的方法一致,这里可以用函数实现。
具体代码如下:
#include "stdafx.h" #include <iostream> using namespace std; long Fibonacci(int n){ if (n == 0 || n == 1) return 1; else return Fibonacci(n - 1) + Fibonacci(n - 2); } int _tmain(int argc, _TCHAR* argv[]) { int n; //接受输入的值 while (1) { cout << "请输入n的值:"; cin >> n; if (n < 0){ cout << "n的值不能小于0,请重新输入" << endl; } else { cout << "F(" << n << ")= " << Fibonacci(n) << endl; } } system("pause"); return 0; }新手初学,有不足之处欢迎大神指点!
