算法基础学习之斐波那契数列求和(递归和动态规划)

目录

 

斐波那契数列

表达式

递推算法求和

递推算法

示例代码

运行结果

动态规划算法求和

动态规划算法

示例代码

运行结果


  • 斐波那契数列

斐波那契数列(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)(≥ 3,∈ 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;
}
  • 运行结果

这个算法的执行效率比我们前面写的那个算法的效率要高的多。

 

发布了47 篇原创文章 · 获赞 37 · 访问量 3683

猜你喜欢

转载自blog.csdn.net/qq_44045338/article/details/105035936
今日推荐