递推算法(顺推)- 斐波那契数列用C++实现

来源:互联网 发布:手机淘宝怎么换皮肤 编辑:程序博客网 时间:2024/05/11 01:58

 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。

 顺推法:顾名思义,顺推法是指“从已知条件出发,逐步推算出要解决的问题”的方法。

这次就先介绍顺推法中的一个典型的例子,斐波那契数列。

题目:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

分析:我们不妨拿新出生的一对小兔子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数组长度为13int _tmain(int argc, _TCHAR* argv[]){long rabbitCount[NUM] = {}; //下标为0-12rabbitCount[0]为初始状态兔子总数量rabbitCount[0] = 1; //rabbitCount[0]为初始状态兔子总数量,值为1rabbitCount[1] = 1; //rabbitCount[1]为一个月后兔子总数量,值为1for(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;elsereturn 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;}

新手初学,有不足之处欢迎大神指点!

0 0
原创粉丝点击