写在前面
最近开始了算法系统学习,备战算法比赛。此文是本人在学习递归算法时的小节,供大家一起学习,如有错误,请联系我及时更正!!感谢=V=
递归算法之求n的阶乘
话不多说直接上代码
int fact(int n)
{
if(n == 0)
{
return 1;
}
return fact(n - 1) * n;
}
递归算法之求斐波那契数列
类似于上题思路,直接上代码
int fib(int n)
{
if(n <= 1)
{
return n;
}
return fib(n - 1) + fib(n - 2);
}
但是此代码时间复杂度高达O(2^n)我们需要一个记忆数组来记忆重复数据
于是就有了
递归算法之斐波那契数列高效版
int memo[1000];
int fibmax(int n)
{
if(n<=1)
{
return n;
}
if(memo[n] != 0)
{
return memo[n]; //直接返回标记
}
return memo[n] = fibmax(n - 1) + fibmax(n - 2); //记录标记时进行更深层递归
}
下面用一道2020年“远光杯”粤澳计算机程序设计大赛网络资格赛的题目Q来作为结尾
问题描述
2020年,注定是不平凡的一年。疫情防控期间,小明的体育老师坚持“开学不返校,网教不停学”的原则,遵循线上教学的规律,精心组织教学设计,倾力打造线上体育课堂,其中一项是让同学们在家里玩跳格子的游戏。
游戏一共有n个格子,排成一列,小明每次只能跳1个格子或2个格子。小明需要从格子的一端跳向另一端,请问他一共有多少种跳法?
输入要求
多组输入。
每组输入一个格子的数量n(1<=n<=35)。
输出要求
每组输出一个整数,代表有多少种跳法,然后换行。
输入样例
2
3
输出样例
2
3
算法思路
简单的递归,将每种情况都实现出来,核心代码 return f(n - 2)+f(n - 1)
并且注意边界处理。
#include <iostream>
using namespace std;
int fun(int n)
{
if( n < 0)
return 0;
if( n == 0 )
return 1;
return fun(n - 1) + fun(n - 2);
}
int main()
{
int n = 0;
while(cin >> n)
{
cout << fun(n) << endl;
}
return 0;
}