算法1:Fibonacci数列
斐波那契数列(Fibonacci)
一、背景介绍
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
【兔子繁殖问题】
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
二、数学定义
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
用数学课表示为:

三、核心代码
方法一:递归
第n个Fibonacci数可递归地计算为:
int fibonacci(int n) {
if (n <= 1)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
方法二:迭代
int fibonacci(int n) {
if (n <= 1)
return 1;
int f = 1, g = 1,ret = 0;
for (int i = 2; i <= n; i++) {
ret = f + g;
f = g;
g = ret;
}
return ret;
}
四、时间复杂度分析
方法一:递归

即可得到O(n^2)。
方法二:迭代
第一种解法比较简单,但是多个元素重复计算,因而时间复杂度较高,为了避免重复计算,可进行循环计算减少时间复杂度,降为O(n)。
五、完整代码
方法一:递归
#include<iostream>
#define scanf scanf_s
using namespace std; int fibonacci(int n) {
if (n <= 1)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
} int main() {
printf("请输入下标:");
int n;
scanf_s("%d", &n);
printf("下标为%d的fibonacci数为%d\n",n, fibonacci(n));
return 0;
}
方法二:迭代
#include<iostream>
#define scanf scanf_s
using namespace std; int fibonacci(int n) {
if (n <= 1)
return 1;
int f = 1, g = 1,ret = 0;
for (int i = 2; i <= n; i++) {
ret = f + g;
f = g;
g = ret;
}
return ret;
} int main() {
printf("请输入下标:");
int n;
scanf_s("%d", &n);
printf("下标为%d的fibonacci数为%d\n",n, fibonacci(n));
return 0;
}
六、提升设计
因而计算f(n)就简化为了计算矩阵的(n-2)次方,而计算矩阵的(n-2)次方,我们又可以进行分解,即计算矩阵(n-2)/2次方的平方,逐步分解下去,由于折半计算矩阵次方,因而时间复杂度为O(log n) 。
#include<iostream>
using namespace std; class Matrix {
public:
int n;
int** m;
Matrix(int num) {
m = new int* [num];
for (int i = 0; i < num; i++) {
m[i] = new int[num];
}
n = num;
clear();
}
void clear() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
m[i][j] = 0;
}
}
}
void unit() {
clear();
for (int i = 0; i < n; i++) {
m[i][i] = 1;
}
}
Matrix operator=(const Matrix mtx) {
Matrix(mtx.n);
for (int i = 0; i < mtx.n; ++i) {
for (int j = 0; j < mtx.n; ++j) {
m[i][j] = mtx.m[i][j];
}
}
return *this;
}
Matrix operator*(const Matrix& mtx) {
Matrix result(mtx.n);
result.clear();
for (int i = 0; i < mtx.n; ++i) {
for (int j = 0; j < mtx.n; ++j) {
for (int k = 0; k < mtx.n; ++k) {
result.m[i][j] += m[i][k] * mtx.m[k][j];
}
}
}
return result;
}
}; int main(int argc,const char*argv[]) {
unsigned int num = 2;
Matrix first(num);
first.m[0][0] = 1;
first.m[0][1] = 1;
first.m[1][0] = 1;
first.m[1][1] = 0;
int t;
cout << "请输入下标: ";
cin >> t;
Matrix result(num);
result.unit();
int n = t - 2;
while (n) {
if (n % 2) {
result = result * first;
}
first = first * first;
n = n / 2;
}
cout << (result.m[0][0] + result.m[0][1]) << endl;
return 0;
}
算法1:Fibonacci数列的更多相关文章
- c语言经典算法---计算Fibonacci数列
算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.下面我就分享一个C语言中比较基础却极为重要的一个算法----计算Fi ...
- java算法 蓝桥杯算法训练 Fibonacci数列
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
- 算法——js(Fibonacci数列)
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指 ...
- 算法设计与分析 1.2 不一样的fibonacci数列 (矩阵快速幂思想)
题目描述 Winder 最近在学习 fibonacci 数列的相关知识.我们都知道 fibonacci 数列的递推公式是F(n) = F(n - 1) + F(n - 2)(n >= 2 且 n ...
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: / 0 n=0 f(n)= ...
- 【算法】Fibonacci(斐波那契数列)相关问题
一.列出Fibonacci数列的前N个数 using System; using System.Collections.Generic; using System.Linq; using System ...
- 算法设计与分析 1.2 不一样的fibonacci数列
★题目描述 fibonacci 数列的递推公式是F(n) = F(n-1) + F(n-2)(n >= 2 且 n 为整数). 将这个递推式改为F(n) = aF(n-1) + bF(n-2)( ...
- fibonacci 数列及其应用
fibonacci 数列及其延展 fibonacci计算 fibonacci数列是指 0,1,1,2,3,5,8,13,21……这样自然数序列,即从第3项开始满足f(n)=f(n-1)+f(n-2): ...
- 蓝桥网试题 java 入门训练 Fibonacci数列
---------------------------------------------------------------------------------------------------- ...
- Fibonacci数列的解法
Fibonacci数列的解法: 1.递归算法 递归的概念,我说不清楚,语文不好.但是核心思想,我认为就是入栈出栈.比方说,你想要求得某个结果,如果一步求解不出来,那么先把最后一步的计算步骤进栈,先不考 ...
随机推荐
- Z-Blog火车头免登录发布教程+插件3.2+支持最新Z-Blog1.7
Z-Blog免登录采集评论,之前没有加入评论接口,今天把评论接口写好了,写一下简单的教程,(采集评论规则是一件很麻烦的事)有时候采集文章的时候也采集评论,今天教大家怎样用我的Z-Blog免登录采集插件 ...
- Prometheus + Grafana 搭建监控系统
前言 本文主要记录下如何使用 Prometheus + Grafana 搭建对各种服务的性能监控,涵盖对 Prometheus.Grafana 的基本介绍,以及如何使用二者进行对 Linux.MySQ ...
- Linux挂载新磁盘
Linux挂载新磁盘 1. 查看磁盘 # df -lh # 查看磁盘占用情况,同时可以查看已挂载的磁盘及其挂载位置 # fdisk -l # 查看所有的磁盘分区 图中 /dev/sdb 下无分区信息, ...
- 两种方式,创建有返回值的DB2函数
函数场景:路径信息由若干个机构编码组成,且一个机构编码是9位字符. 要求:获取路径信息,并且删除路径中包含'99'开头的机构编码. 从客户端及服务器端分别创建ignore99(pathinfo var ...
- 编译python为可执行文件遇到的问题:使用python-oracledb连接oracle数据库时出现错误:DPY-3010
错误原文: DPY-3010: connections to this database server version are not supported by python-oracledb in ...
- 为什么 Rust 备受开发者青睐?
引子 作为一名敏锐的前端开发者,您可能早已对 Rust 有所耳闻,毕竟近几年,使用 Rust 开发的前端构建工具每经发布,其卓越的性能数据总是能带来社区的一阵惊叹. 图片来源:https://swc. ...
- 【开源】给ChatGLM写个,Java对接的SDK
作者:小傅哥 - 百度搜 小傅哥bugstack 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 清华大学计算机系的超大规模训练模型 Cha ...
- 记Halo1.5版本迁移Halo2.10.0版本
原文地址: 记Halo1.5版本迁移Halo2.10.0版本 - Stars-One的杂货小窝 上一篇Window10安装linux子系统及子系统安装1Panel面板 - Stars-One的杂货小窝 ...
- C++ 与 QML 之间进行数据交互的几种方法
一.属性绑定 这是最简单的方式,可以在QML中直接绑定C++ 对象的属性.通过在C++ 对象中使用Q_PROPERTY宏定义属性,然后在QML中使用绑定语法将属性与QML元素关联起来. person. ...
- Go语言基准测试(benchmark)三部曲之一:基础篇
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于基准测试(benchmark) Go的标准库内置的 ...