递推算法(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;
}
相关推荐
海的诗篇_2 分钟前
移除元素-JavaScript【算法学习day.04】
javascript·学习·算法
勤奋的知更鸟8 分钟前
Java编程之原型模式
java·开发语言·原型模式
自动驾驶小卡13 分钟前
A*算法实现原理以及实现步骤(C++)
算法
Unpredictable22215 分钟前
【VINS-Mono算法深度解析:边缘化策略、初始化与关键技术】
c++·笔记·算法·ubuntu·计算机视觉
编程绿豆侠15 分钟前
力扣HOT100之多维动态规划:1143. 最长公共子序列
算法·leetcode·动态规划
珂朵莉MM22 分钟前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
香蕉炒肉36 分钟前
Java优化:双重for循环
java·开发语言
傍晚冰川1 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
PingdiGuo_guo1 小时前
C++智能指针的知识!
开发语言·c++
黄雪超1 小时前
JVM——打开JVM后门的钥匙:反射机制
java·开发语言·jvm