递推算法(c++)

递推可以说是递归反过来的一种算法,递归是从后往前倒着算,递推是从前往后正着算。

统计每个月兔子的总数
题目描述
有一对兔子,从出生后第3个月起每个月都生一对兔子,一对小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问第n个月(n<=50)的兔子总数为多少对?
输入
输入1个整数n,表示第几个月
输出
第n个月兔子的总数量有多少对?
样例
输入复制
9
输出复制
34

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[100];
	a[0] = 1;
	a[1] = 1;
	int n;
	cin>>n;
	cout<<1<<endl<<1<<endl;
	for(int i = 2;i<n;i++)
	{
		a[i] = a[i-1]+a[i-2];
		cout<<a[i]<<endl;
	}
	return 0;
}

猴子吃桃子
题目描述
猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半还不过瘾,又多吃了一个;第二天又
将剩下的桃子吃掉一半又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个。到了第十天
想再吃时,见只剩下一个桃子,求第一天共摘了多少个桃子?
输入

输出
一个整数,第一天共有多少个桃子

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[20];
	a[10] = 1;
	for(int i = 9;i>=1;i--)
	{
		a[i] = (a[i+1]+1)*2;
	}
	cout<<a[1];
	return 0;
}
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[110],b;
	a[1] = 1;
	int n;
	cin>>n;
	b = 1;
	for(int i = 2;i<=n;i++)
	{
		a[i] = a[i-1]+i;
		b = b+a[i];
	}
	cout<<b;
	return 0;
}

Pell数列
题目描述
有一种数列,它的前10项的值分别为:1 2 5 12 29 70 169 408 985 2378,这个数列被称
为Pell数列,请问该数列的第n项的值是多少?(n<=1000)
输入
一个整数n。
输出
第n项的值。
样例
输入复制
10
输出复制
2378
青少年编程

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[1010];
	int n;
	cin>>n;
	a[1] = 1;
	a[2] = 2;
	for(int i = 3;i<=n;i++)
	{
		a[i] = a[i-1]*2+a[i-2];
	}
	cout<<a[n];
	return 0;
}

上台阶
描述
楼梯有n(30 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一
步上3阶,编程计算共有多少种不同的走法。
输入
输入的每一行包括一组测试数据,即为台阶数n。最后一行为0,表示测试结束。
输出
每一行输出对应一行输入的结果,即为走法的数目。
样例输入
1
2
3
4
0
样例输出
1
2
4
7

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[1010];
	int b[50];
	int n;
	for(int i = 0;true;i++)
	{
		int t;
		cin>>t;
		if(t==0)
		{
			n = i;
			break;
		}
		b[i] = t;
	}
	a[1] = 1;
	a[2] = 2;
	a[3] = 4;
	for(int i = 4;i<=30;i++)
	{
		a[i] = a[i-1]+a[i-2]+a[i-3];
	}
	cout<<endl;
	for(int i = 1;i<=n;i++)
	{
		cout<<a[i]<<endl;
	}
	return 0;
}
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[110];
	int m,n;
	cin>>m>>n;
	n = n-m+1;
	a[1] = 1;
	a[2] = 1;
	for(int i = 3;i<=n;i++)
	{
		a[i] = a[i-1]+a[i-2];
	}
	cout<<a[n];
	return 0;
}
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[100];
	a[1] = 1;
	a[2] = 2;
	a[3] = 4;
	int n;
	cin>>n;
	for(int i = 4;i<=n;i++)
	{
		a[i] = a[i-1]+a[i-2]+a[i-3];
	}
	cout<<a[n];
	return 0;
}

(此题有不用递推的其他简便方法)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int m,n;
	cin>>m>>n;
	if((m*n)%2==0)
	{
		cout<<m*n/2;
	}
	else
	{
		cout<<(m*n-1)/2;
	}
	return 0;
}
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
	long long a[10010];
	a[1] = 2;
	a[2] = 4;
	a[3] = 8;
	int n;
	cin>>n;
	for(int i = 4;i<=n;i++)
	{
		a[i] = a[i-1]+a[i-2]+a[i-3];
	}
	cout<<a[n];
	return 0;
}

菲波那契数列(2)
描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都
等于前面2个数之和。 给出一个正整数a,要求菲波那契数列中第a个数对1000取
模的结果是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正
整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数
对1000取模得到的结果。
样例输入
4
5
2
19
1
样例输出
5
1
181
1

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
long long a[1000010];
int main()
{
	int b[10000];
	int n;
	cin>>n;
	for(int i = 0;i<n;i++)
	{
		cin>>b[i];
	}
	a[1] = 1;
	a[2] = 1;
	for(int i = 3;i<=1000000;i++)
	{
		a[i] = (a[i-1]+a[i-2])%1000;
	}
	cout<<endl;
	for(int i = 0;i<n;i++)
	{
		cout<<a[b[i]]<<endl;
	}
	return 0;
}
相关推荐
binishuaio2 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE4 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻8 分钟前
WPF中的依赖属性
开发语言·wpf
洋24016 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙18 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点19 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
王哈哈^_^21 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城23 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
NoneCoder36 分钟前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
苏三有春36 分钟前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt