一个小的日常实践——高速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语言名题精选百则》
版权声明:本文博主原创文章,博客,未经同意,不得转载。
一个小的日常实践——高速Fibonacci数算法的更多相关文章
- 每日一小练——高速Fibonacci数算法
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- 一个性能较好的jvm參数配置以及jvm的简单介绍
一个性能较好的webserverjvm參数配置: -server //服务器模式 -Xmx2g //JVM最大同意分配的堆内存,按需分配 -Xms2g //JVM初始分配的堆内存.一般和Xmx配置成一 ...
- SCAU1143 多少个Fibonacci数--大菲波数【杭电-HDOJ-1715】--高精度加法--Fibonacci数---大数比较
/*******对读者说(哈哈如果有人看的话23333)哈哈大杰是华农的19级软件工程新手,才疏学浅但是秉着校科联的那句“主动才会有故事”还是大胆的做了一下建一个卑微博客的尝试,想法自己之后学到东西都 ...
- 用 Python 图像识别打造一个小狗分类器
项目介绍 小狗分类器可以做什么? 通过这个分类器,你只需要上传照片,就可以得到小狗的品种,以及更多的信息. 这就是所谓的「机器学习」,让机器自己去“学习”.我们今天要做的这个分类任务,是一个“监督 ...
- java 练手 Fibonacci数
Problem B Fibonacci数 时间限制:3000 ms | 内存限制:65535 KB 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列 ...
- 记一次小团队Git实践(下)
在上篇中,我们已经能基本使用git了,接下来继续更深入的挖掘一下git. 更多的配置自定义信息 除了前面讲的用户名和邮箱的配置,还可以自定义其他配置: # 自定义你喜欢的编辑器,可选 git conf ...
- 记一次小团队Git实践(中)
对于初学者,从使用上先入手,往往学的最快,并从中汲取教训,再回头更深入的学习,效果尤佳. 安装git 安装git自不必说,mac已经内置了git,linux下一个命令就能搞定,windows下需要下载 ...
随机推荐
- CentOS Kernel Source Install
http://linuxmoz.com/centos-kernel-source-install/
- 3p
哈,不要自卑.爱情和婚姻可遇不可求,缘到自然成.首要的是人好,容貌別太差,毕竟天天在一起看着要舒心才好,另外应该有上进心,避免势利小人.这些,都要看机缘.所谓right person at right ...
- poj3295 Tautology , 计算表达式的值
给你一个表达式,其包括一些0,1变量和一些逻辑运算法,让你推断其是否为永真式. 计算表达式的经常使用两种方法:1.递归: 2.利用栈. code(递归实现) #include <cstdio&g ...
- 服务器编程入门(3)TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- hdu4578(线段树)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:n个数,初始值为0,4种操作: 1.将某个区间所有值加上另一个值: 2.将区间所有值都乘上 ...
- spring 普通类获取四大作用域request、applicationContext、session、page
几乎所有web应用容器都提供了四种类似Map的结构:application session request page,Jsp或者Servlet通过向着这四个对象放入数据,从而实现Jsp和Servlet ...
- NPC
这里的想说的NPC不是Non-Player-Controled,非玩家控制角色,而是Non-determinisitc Polynomial complete problem,它属于一类很特殊的问题, ...
- Instruments的使用 逻辑查错,内存泄漏分析等工具集
原创文章,转载请注明 XCode 开发后期,要对代码进行改进和优化,查内存泄漏是其中一项重要工作,今天下午偷了点时间,把前段时间的代码稍微整理了一下,顺带用了下这个工具,还真发现了些问题.这里记录一下 ...
- poj1236 有向图加边变成强连通图
给我们一个有向图,有两个问题 1.最少要给多少个点发消息,才能使得所有的点都收到消息(消息可以随边传递) 2.最少需要多少条边才能使得图变成强连通图 对于一个强连通分量,可以当做一个点来考虑,所以我们 ...
- windows phone (20) Image元素
原文:windows phone (20) Image元素 之前有说道wp目前支持的图片格式为png和jpeg ,我们可以通过设置Source属性设置图片源,下面要说的是Iamge元素的部分属性,这就 ...