递归:自己调用自己
运算过程:从所需结果出发不断回溯前一运算 --直到-->初值 --递推--> 所需结果
注意:在做题的时候一般通过 递归搜索树 来解决,具体演示在 ”例题部分“。
递推:从前往后算出来
运算过程:从初值出发 反复进行某一运算 --> 所需结果
---------------------------------------------------------------------------------------------------------------------------------
实例解释:
分别用递归、递推来 表示斐波那契数列。
首先需要对斐波那契数列进行了解:
------------------------------
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……这个数列从第3项开始,每一项都等于前两项之和。
-----------------------------
基本了解了此数列后那么
先用递归方法求:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
//递归
int dfs(int n)
{
if(n == 0) return n;
if(n == 1) return n;
return dfs(n-1) + dfs(n-2); //此处便是运用递归的核心了反复调用自己来实现想要的结果
}
int main()
{
int n = 0;
cin >> n;
cout << dfs(n) << endl;
return 0;
}
然后是递推
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int a[50];
a[0] = 0; //令数组第一项为0
a[1] = 1; //第二项为1
for(int i =2; i <= n; i++)
{
a[i] = a[i-1] + a[i-2];
}
//枚举所有结果
for(int i = 0; i <= n; i++)
{
cout << a[i] << endl;
}
return 0;
}
--------------
到这里基本就结束了,最后是一个递推的优化版本
--------------
递推(优化版)
#include<iostream>
#include<cstdio>
#include<cstring>
usign namespace std;
//优化点:把数组换成俩个变量(滚动变量)
//动态规划中 滚动数组的雏形。
int main()
{
int n;
cin >> n;
int a = 0, b = 1; //这里的a,b分别代表 f[0],f[1]。
for(int i =1; i <= n; i++)
{
cout << a << " ";
int fin = a + b; //a 相当于 n-1 b 相当于n-2
a = b;
b = fin;
}
return 0;
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------