目录
-
斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
-
表达式
F(n)=F(n-1)+F(n-2)(n>=3)
F(1)=1,F(2)=1
-
递推算法求和
-
递推算法
递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。
由于递推算法会不断耗费系统资源,导致项数过多以后会求值时间过长。
-
示例代码
#include <iostream>
#include <string>
using namespace std;
int fib(int num)
{
return num < 3 ? 1 : fib(num-1)+fib(num - 2); //求出斐波那契数列的每一项
}
void test()
{
static int result = 0;
int num = 0;
for (cin >> num; num > 0; num--)
{
result += fib(num); //求和
}
cout << result << endl;
}
int main(int argc, char** argv)
{
test();
system("pause");
return 0;
}
-
运行结果
这个算法只适合小项求和,一旦求和项过多,就会出现等待时间过长,耗费系统资源过多。
比如输入64项求和,你可能会等很长时间:
-
动态规划算法求和
-
动态规划算法
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
基本思想与策略编辑:
由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
动态规划可以利用分而治之的思想,就把一个复杂的问题分为一些简单的小问题,从而降低算法的复杂度。
下图使求解斐波那契数列的动态规划示意图:
编程示例的动态规划示意图 ,又自顶而下的递归改为自低而上的迭代
-
示例代码
#include <iostream>
#include <string>
using namespace std;
int fib(int num)
{
int f = 0;//fib(0)
int g = 1;//fib(1)
while (0 < num--)
{
g = g + f;
f = g - f;
}
return g;
}
void test()
{
static int result = 0;
int num;
int i = 0;
cout << "请输入需要求和的项数:(从第0项开始) " << endl;
cin >> num;
for (i = 0; i < num + 1; i++)
{
result += fib(i);
}
cout << result << endl;
}
int main(int argc, char** argv)
{
test();
system("pause");
return 0;
}
-
运行结果
这个算法的执行效率比我们前面写的那个算法的效率要高的多。