一个小的日常实践——高速Fibonacci数算法

简介:

上得厅堂。下得厨房。写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!


题目:高速Fibonacci数算法


内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律:


             


尝试寻找高速的求出fn的方法


我的解法:上来没多想。打开vs2013就敲了起来。问题果然非常easy,分分钟就超神。。

奥。不正确就攻克了!

事实上题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,只是由于求解高速方法在递归之前,我编写了一个非递归的算法


#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int f(int n);
	cout << f(7) << endl;
	getchar();
	return 0;
}

int f(int n)
{
	int temp = 0, f1 = 1, f2 = 1;
	if (n == 1 || n == 2)
		return 1;
	else
	{
		for (int i = 1; i < (n - 1); i++)
		{
			temp = f1 + f2;
			f2 = f1;
			f1 = temp;
		}
		return temp;
	}
}

然后我又编写了递归的算法


#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int f(int n);
	cout << f(7) << endl;
	getchar();
	return 0;
}

int f(int n)
{
	if (n == 1|| n==2)
		return 1;
	if (n > 2)
		return f(n - 1) + f(n - 2);
}


在递归的基础上,有人提出了更犀利的算法,这个我没有想到。。羞愧。

。。

这个算法利用了一些技巧矩阵,通过矩阵乘法来算Fibonacci的加法。然后通过我在《数值自乘非递归解》中提到的利用区分奇偶数来利用指数二进制堆乘的方法。降低乘法的次数。

ps:


利用上面的矩阵连乘,在矩阵11位置的数就是矩阵11和21的和。而且用矩阵11和21表示Fibonacci的f(n-1)和f(n-2),通过连乘来求fn。


#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int f(int n);
	cout << f(7) << endl;
	getchar();
	return 0;
}

int f(int n)
{
	void matrix_power(int a, int b, int c, int d, int n, int *aa, int *bb, int *cc, int *dd);
	int a, b, c, d;
	if (n == 1 || n == 2)
	{
		return 1;
	}
	else
	{
		matrix_power(1, 1, 1, 0, n - 2, &a, &b, &c, &d);
		return a + b;
	}
}

void matrix_power(int a, int b, int c, int d, int n, int *aa, int *bb, int *cc, int *dd)
{
	int xa, xb, xc, xd;
	if (n == 1)
		*aa = a, *bb = b, *cc = c, *dd = d;
	else if (n & 0x01 == 1)
	{
		matrix_power(a, b, c, d, n - 1, &xa, &xb, &xc, &xd);
		*aa = a*xa + b*xc;
		*bb = a*xb + b*xd;
		*cc = c*xa + d*xc;
		*dd = c*xb + d*xd;
	}
	else
	{
		matrix_power(a, b, c, d, n >> 1, &xa, &xb, &xc, &xd);
		*aa = xa*xa + xb*xc;
		*bb = xa*xb + xb*xd;
		*cc = xc*xa + xd*xc;
		*dd = xc*xb + xd*xd;
	}
}

三段代码的实验结果同例如以下:



欢迎大家增加每日一小练,嘿嘿!

每天练一练,日久见功夫。加油!


            -End-

參考文献:《c语言名题精选百则》




版权声明:本文博主原创文章,博客,未经同意,不得转载。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4758369.html,如需转载请自行联系原作者


相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
95 3
|
1月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
163 30
|
1月前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
292 15
|
3月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
3月前
|
机器学习/深度学习 人工智能 Rust
MindSpore QuickStart——LSTM算法实践学习
MindSpore QuickStart——LSTM算法实践学习
61 2
|
3月前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
45 0
|
4月前
|
数据采集 算法 物联网
【算法精讲系列】阿里云百炼SFT微调实践分享
本内容为您提供了百炼平台SFT微调的实践案例,帮助您方便并快速借助模型微调定制化您自己的专属模型。
|
5月前
|
DataWorks 算法 调度
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
57 1
|
5月前
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
39 1

热门文章

最新文章