递推算法是非常常用的算法思想,在数学计算等场合有着广泛的应用。递推算法适合有明显公式规律的场合。

递推算法基本思想

递推算法是一种理性思维莫斯的代表,根据已有的数据和关系,逐步推到而得到结果。递推算法的执行过程如下:

(1)根据已知结果和关系,求解中间结果。

(2)判断是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果。如果满足要求,则表示寻找到一个正确答案。

递推算法需要用户知道答案和问题之间的逻辑关系。在许多数学问题中,都有明确的计算公式可以遵循,因此可以采用递推算法来实现。

递推算法示例

数学里面的斐波那契数列是一个使用递推算法的经典例子。

13世纪意大利数学家斐波那契的《算盘书》中记载了典型的兔子产仔问题,其大意如下:

如果一对一个月大的兔子以后每一个月都可以生一对小兔子,而一对新生的兔子出生两个月才可以生出小兔子。也就是,1月份出生,3月份开始产仔。那么假定一年内没有产生兔子死亡事件,那么1年之后共有多少对兔子呢?

1.递归算法

我们来分析一下兔子产仔问题。我们先逐月看每月兔子的对数。

第一个月:1对兔子;

第二个月:1对兔子;

第三个月:2对兔子;

第四个月:3对兔子;

第五个月:5对兔子;

第六个月:8对兔子;

………………

从上面可以看出,从第三个月开始,每个月的兔子总对数等于前两个月兔子数的总和。相应的计算公式如下:

第n个月兔子总数Fn=Fn-1+Fn-2

这里初始第一个月的兔子数F1=1,第二个月的兔子数F2=1。

可以用递归公式来求解。为了通用型的方便,我们可以编写一个算法,用于计算斐波那契数列问题,按照这个思虑来编写相应的兔子产仔问题的求解算法,示例代码如下:

/*
输入参数n为经历的时间(单位是月),程序中通过递归调用来实现斐波那契数列的计算。
*/
int Fibonacci(n)
{
int t1,t2;
if(n>0)
{
if(n==1||n==2)
{
return 1;
}
else
{
t1=Fibonacci(n-1);
t2=Fibonacci(n-2);
return t1+t2;
}
}
else
{
return 0;
}
}

递归算法求解兔子产仔问题

有了上述通过的兔子产仔问题算法后,我们可以求解任意的此类问题。这里给出完整的兔子产仔问题求解代码:

#include<iostream>
using namespace std;
/*
输入参数n为经历的时间(单位是月),程序中通过递归调用来实现斐波那契数列的计算。
*/
int Fibonacci(int n)
{
int t1,t2;
if(n>0)
{
if(n==1||n==2)
{
return 1;
}
else
{
t1=Fibonacci(n-1); //递归调用获取F(n-1)
t2=Fibonacci(n-2); //递归调用获取F(n-2)
return t1+t2;
}
}
else
{
return 0;
}
}
int main()
{
int n,num;
cout<<"递推算法求解兔子产仔问题:"<<endl;
cout<<"请输入时间:"<<endl;
cin>>n;
num=Fibonacci(n);
cout<<"经过"<<n<<"个月之后"<<endl;
cout<<"兔子的数量为:"<<num<<"对"<<endl;
return 0;
}

执行该程序,用户输入12,得到如图结果:

最新文章

  1. CozyRSS1.0 - 有可用性版本
  2. 企业应用系统设计分享PPT
  3. sharepoint 2013 文件“/_controltemplates/SPMRB/AllStatBookingsForm.ascx”不存在
  4. CSS架构
  5. Android-BaiduMapSDK示例的key验证失败问题
  6. jQuery图片延迟加载插件jQuery.lazyload使用方法(转)
  7. winform开发中绑定combox到枚举
  8. Python python 基本语法
  9. React Native 实现MQTT 推送调研 (1)
  10. 火狐flash插件
  11. 【转】如何高效利用GitHub&mdash;&mdash;2013-08-28 22
  12. 【Maven实战】传递性依赖的问题
  13. datanode启动后,在web50070port发现不到datanode节点(能力工场)
  14. MyReport报表引擎2.7.6.7新功能
  15. C#实现手机发送验证码
  16. 微信qq,新浪等第三方授权登录的理解
  17. maven入门(10)maven的仓库
  18. [ci]jenkins构建容器项目java-helloworld-非docker plugin模式
  19. httpd
  20. Estimation And Gain

热门文章

  1. iOS 当前应用或者浏览器中 唤起 手机其他应用
  2. LintCode:链表操作(合并与反转)
  3. IAR 条件断点
  4. 转的es6 =&gt;函数
  5. hdu 5475 线段树
  6. 常见SQL函数需要注意的细节
  7. BI入门经典(转载)
  8. DoTween插件
  9. 处理json的工具类({本类为处理json的工具类})
  10. long long 与 __int64