【C++】第4章:(一)从Fibonacci数列和猴子吃桃问题看递推法

1.什么是递推法?

一.递推法
指从问题的已知条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果
二.递推初始条件确定
1.问题本身已经给定;
2.通过对问题的分析与化简后确定;
三.递推方向
1.顺推法
从已知初始条件出发,通过递推关系逐步推算出要解决的问题的结果的方法。如求Fibonacci数列
2.倒推法
在不知初始值的情况下,经某种递推关系而获知了问题的解或目标,从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始情况。如猴子吃桃

2.如何实现递推法?

1.确定递推变量
要根据问题的具体实际,设置递推变量。
2.建立递推关系
递推关系是指如何从变量的前一些值推出其下一个值,或从变量的后一些值推出其上一个值的公式(或关系)。
3.确定初始(边界)条件
对所确定的递推变量,要根据问题最简单情形的数据确定递推变量的初始(边界)值,这是递推的基础。
4.对递推过程进行控制
递推过程不能无休止地重复下去。递推过程在什么时候结束,满足什么条件结束,这是编写递推算法必须考虑的问题。

顺推法(Fabonacci数列)

【例】设计程序输出Fibonacci数列的前20项,要求每行输入5个数据。
数列定义:
n=0 fib(n)=0;
n=1 fib(n)=1;
n>1 fib(n)=fib(n-2)+fib(n-1)

问题分析
fib1=0;
fib2=1;
fib3=fib1+fib2;

用for语句表达循环

for(n=3;n<=20;n++)
{
fib1=fib2;
fib2=fib3;
fib3=fib1+fib2;//一直空出fib3的位置放新的数
}

每行输入5个数据:
if(n%5==0)–>输出换行

程序代码如下:

#include <iostream>
#include <iomanip> 
using namespace std;
int main ()
{
  int fib1=0,fib2=1,fib3,n;//设置前两项数,并设置相应变量 
  cout<<"Fibonacci数列前20项:\n";
  cout<<setw(5)<<fib1<<setw(5)<<fib2;//输出前2个数据 
  for(n=3;n<=20;n++)//控制20个数据的生成
  {
  fib3=fib1+fib2;//根据题目要求计算第3个数 
  cout<< setw(5)<<fib3;//输出计算的数
  if(n%5==0) cout<<endl;//控制每行输出5个数据后换行
  fib1=fib2;
  fib2=fib3;//根据规律,把前两项数据移动为新的数 
  } 
  return 0;
}

在这里插入图片描述

倒推法(猴子吃桃问题)

猴子第一天摘下若干桃子,吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃了一半,并多吃了一个。以后每天吃掉前一天剩下的一半零一个。到第10天再想吃时,发现只剩下一个桃子。问:第一天共摘了几个桃子。
问题分析
第一天的桃子数量,等于第二天的桃子数量加1然后乘以2
第二天的桃子数量,等于第三天的桃子数量加1然后乘以2

对第10天来说是一个确定的值
x10=1,那么对第9天来说,
x9=2*(x10+1)
x8=2*(x9+1)

x=2*(x+1)

day=10;x=1;
while(day>1)
{
x=2*(x+1);
day–;
}

程序代码如下:

#include <iostream> 
using namespace std;
int main ()
{
 int x=1,day=10;
 while(day>1)
  {
   x=(x+1)*2;
   day--;
  }
  cout<<"x="<<x<,endl;
 return 0;
}

结果:
x=1534

发布了19 篇原创文章 · 获赞 0 · 访问量 220

猜你喜欢

转载自blog.csdn.net/weixin_44825297/article/details/104989033