【斐波那契数列】算法优化笔记
题目:斐波那契数列为:1,1,2,3,5,8…,求第n项?
初步分析
- 设an为斐波那契数列。
- a1=a2=1;(n<=2)
- an=a(n-1) + a(n-2);(n>=2)
本章总结
【小总结】
1.【尽量不用递归】
2.【利用数据结构】
3.【动态规划】
4.【位运算】
【详细总结】
以下代码因不同算法而时间复杂度不同个人归类为不同版本,总结如下。
1.尽量不要用递归,纵使好看,但由于递归在内存中使用的堆栈的方式,自然是浪费空间。
2.利用数据结构,数组,哈希表等优化算法。
3.以下利用到了动态规划的滚动数组。
4.用位运算来代替乘法、除法以及取模。
5.有数学公式用数学公式@.@…
详细代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;namespace Fibonacci_Sequence
{class Program{/// <summary>/// 垃圾递归fun1/// </summary>/// <param name="n">数值n</param>/// <returns>第n项的值</returns>static int fun1(int n){if (n == 1 || n == 2) return 1;else return fun1(n - 1) + fun1(n - 2);}/// <summary>/// 数组存储/// </summary>/// <param name="n">数值n</param>/// <returns>第n项的值</returns>static int fun2(int n){if (n == 1 || n == 2)return 1;else{int[] array = new int[n + 1];array[1] = array[2] = 1;for (int i = 3; i < n + 1; i++){array[i] = array[i - 1] + array[i - 2];}return array[n];}}/// <summary>/// 滚动数组简单版1/// </summary>/// <param name="n">数值n</param>/// <returns>第n项的值</returns>static int fun3(int n){if (n == 1 || n == 2)return 1;else{int[] array = new int[2];array[0] = array[1] = 1;for (int i = 2; i < n; i++){array[1] = array[0] + array[1];array[0] = array[1] - array[0];}return array[1];}}/// <summary>/// 滚动数组简单版2/// </summary>/// <param name="n">数值n</param>/// <returns>第n项的值</returns>static int fun4(int n){if (n == 1 || n == 2)return 1;else{int[] array = new int[2];array[0] = array[1] = 1;for (int i = 2; i < n; i++){array[i % 2] = array[(i-1) % 2] + array[(i - 2) % 2];}return array[(n+1) % 2];//或//for (int i = 3; i <= n; i++)//{// array[i % 2] = array[(i - 1) % 2] + array[(i - 2) % 2];//}//return array[n % 2];}}/// <summary>/// 滚动数组逻辑与版本/// </summary>/// <param name="n">数值n</param>/// <returns>第n项的值</returns>static int fun5(int n){if (n == 1 || n == 2)return 1;else{int[] array = new int[2];array[0] = array[1] = 1;for (int i = 3; i <= n; i++){array[i & 1] = array[(i - 1) & 1] + array[(i - 2) & 1];}return array[n & 1];}}static void Main(string[] args){int n = int.Parse(Console.ReadLine().ToString());//获取数据nConsole.WriteLine("fun1用时间" + getCostTime(fun1, n)+"\n");//输出耗费时长Console.WriteLine("fun1用时间" + getCostTime(fun2, n) + "\n");//输出耗费时长Console.WriteLine("fun1用时间" + getCostTime(fun3, n) + "\n");//输出耗费时长Console.WriteLine("fun1用时间" + getCostTime(fun4, n) + "\n");//输出耗费时长Console.WriteLine("fun1用时间" + getCostTime(fun5, n) + "\n");//输出耗费时长Console.ReadLine();}/// <summary> /// 获取此方法的耗费时间 /// </summary>/// <param name="function">方法</param>/// <param name="n">数值</param>/// <returns>耗费时间</returns>static long getCostTime(Func<int, int> function, int n){Stopwatch sw = new Stopwatch();sw.Start();Console.WriteLine("值:" +function(n));sw.Stop();return sw.ElapsedMilliseconds;}}
}
【斐波那契数列】算法优化笔记相关推荐
- PHP 算法之斐波那契数列算法 计算出生兔子的数量
<斐波那契数列算法> 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:一对兔子也 ...
- 斐波那契数列递归算法优化
一.前言 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765, ...
- Php斐波那契数列尾递归优化,递归优化的这三种方式你知道吗?
估计找工作的,都会碰到面试官老是问道"递归算法",感同身受,前段时间面试的时候,就有一家问道这个问题,是非常典型的问题.在前面一篇世界上有哪些代码量很少,但很牛逼很经典的算法或项目 ...
- 斐波那契数列算法(C#)
上周抽了一天的时间去6家公司面试,时间太紧都是马马虎虎的,好在这趟面试还是有很多收获的,由此可见自己的理论功底真是差劲的要死,还有语言表达能力. 调侃的来说混了这么久,没有衣××的理论功底,只有雷×× ...
- 斐波那契数列递归优化
背景:今天看网课提到了斐波那契数列使用递归效率过低的问题,于是自己写代码使用递归求第100项,出去吃完早饭回来还没跑完...好吧,需求来了,我们来开始优化吧!
- 斐波拉契数列——算法
斐波拉契数列 题目描述 斐波那契数列是一组第一位F1和第二位F2为1,从第三位开始,后一位是前两位和的一组递增数列Fn=Fn-1+Fn-2. 那么当n比较大时,Fn也非常大,现在我们想知道,第n项,F ...
- 斐波那契数列及其优化
菲波那契数列定义为:f(1) = 1; f(2) = 1; 当n>2时,f(n) = f(n-1) + f(n-2),输入n,求菲波那契数列的第n项.要求:用递归函数求菲波那契数列的第n项. 1 ...
- Python斐波那契数列算法
第一种.函数求裴波那契数列: def func(num):if n==1 or n==2: # 如果n等于1或者2return 1 # 返回1else: # 否则return func(n-1)+fu ...
- 斐波那契Fibonacci 算法优化
方法一: 递归法 int Fib(int n){if(n==1 || n==2) return 1;return Fib(n-1)+Fib(n-2); } 递归法的时间复杂度为o(2^n). 递归算法 ...
- 斐波那契数列算法c语言实现
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法.#include <stdio.h> int n,m,i,j; i ...
最新文章
- 死亡空间2显卡测试软件,《死亡空间3》画质分辨率及硬件性能测试
- LINUX内核分析第八周总结:进程的切换和系统的一般执行过程
- java 播放.pcm文件,java播发PCM文件
- C/C++信息隐写术(四)之大程序藏入BMP文件
- Flink流处理操作符
- (32) css—opcity属性
- 关于我的文章说明及联系方式
- Futter基础第2篇: 实现文本、容器【Text、Container】
- easypoi 语法_知识点总结及语法学习资料及视频
- 机器学习基础---回归方法---支持向量回归(SVR)
- html怎么导航栏中加边框,html – 使用CSS在导航栏中显示边框三角形
- python图片识别文字开源库Easyocr使用
- java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...
- java文字手写识别_【手写文字识别】-JavaAPI示例代码
- as3 同屏1000+动画,不掉帧。解决方案。
- 计算机时间转换工具,计算机时间的转换
- 图构建:领域本体设计原则与动态本体
- Wowza 的Http扩展 (Publish State)
- 二维码的扫描和生成二维码
- 预估市场过万亿,“即时零售”到底是什么来头?
热门文章
- RoFormerV2:自然语言理解的极限探索
- 微软、UIUC韩家炜组联合出品:少样本NER最新综述
- Transformer性能被高估?DeepMind动态评估模型的时间泛化能力
- 史上最全!近千篇机器学习自然语言处理论文!都这儿了
- SIGIR 2020 | 第四范式提出深度稀疏网络模型,显著提升高维稀疏表数据分类效果...
- Let's Fork | 11 款 Github 最新「机器学习」开源项目
- AIProCon在线大会笔记之清华大学唐杰教授:人工智能的下一个十年
- HDU 1175 连连看 dfs+剪枝
- html中inline函数,开窗函数和窗口函数区别 inline函数和一般的函数有什么不同
- oracle 安装及使用方法,Oracle安装及使用小结