【斐波那契数列】算法优化笔记
生活随笔
收集整理的這篇文章主要介紹了
【斐波那契数列】算法优化笔记
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:斐波那契數(shù)列為:1,1,2,3,5,8…,求第n項(xiàng)?
初步分析
本章總結(jié)
【小總結(jié)】
1.【盡量不用遞歸】
2.【利用數(shù)據(jù)結(jié)構(gòu)】
3.【動(dòng)態(tài)規(guī)劃】
4.【位運(yùn)算】
【詳細(xì)總結(jié)】
以下代碼因不同算法而時(shí)間復(fù)雜度不同個(gè)人歸類(lèi)為不同版本,總結(jié)如下。
1.盡量不要用遞歸,縱使好看,但由于遞歸在內(nèi)存中使用的堆棧的方式,自然是浪費(fèi)空間。
2.利用數(shù)據(jù)結(jié)構(gòu),數(shù)組,哈希表等優(yōu)化算法。
3.以下利用到了動(dòng)態(tài)規(guī)劃的滾動(dòng)數(shù)組。
4.用位運(yùn)算來(lái)代替乘法、除法以及取模。
5.有數(shù)學(xué)公式用數(shù)學(xué)公式@.@…
詳細(xì)代碼
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">數(shù)值n</param>/// <returns>第n項(xiàng)的值</returns>static int fun1(int n){if (n == 1 || n == 2) return 1;else return fun1(n - 1) + fun1(n - 2);}/// <summary>/// 數(shù)組存儲(chǔ)/// </summary>/// <param name="n">數(shù)值n</param>/// <returns>第n項(xiàng)的值</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>/// 滾動(dòng)數(shù)組簡(jiǎn)單版1/// </summary>/// <param name="n">數(shù)值n</param>/// <returns>第n項(xiàng)的值</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>/// 滾動(dòng)數(shù)組簡(jiǎn)單版2/// </summary>/// <param name="n">數(shù)值n</param>/// <returns>第n項(xiàng)的值</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>/// 滾動(dòng)數(shù)組邏輯與版本/// </summary>/// <param name="n">數(shù)值n</param>/// <returns>第n項(xiàng)的值</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());//獲取數(shù)據(jù)nConsole.WriteLine("fun1用時(shí)間" + getCostTime(fun1, n)+"\n");//輸出耗費(fèi)時(shí)長(zhǎng)Console.WriteLine("fun1用時(shí)間" + getCostTime(fun2, n) + "\n");//輸出耗費(fèi)時(shí)長(zhǎng)Console.WriteLine("fun1用時(shí)間" + getCostTime(fun3, n) + "\n");//輸出耗費(fèi)時(shí)長(zhǎng)Console.WriteLine("fun1用時(shí)間" + getCostTime(fun4, n) + "\n");//輸出耗費(fèi)時(shí)長(zhǎng)Console.WriteLine("fun1用時(shí)間" + getCostTime(fun5, n) + "\n");//輸出耗費(fèi)時(shí)長(zhǎng)Console.ReadLine();}/// <summary> /// 獲取此方法的耗費(fèi)時(shí)間 /// </summary>/// <param name="function">方法</param>/// <param name="n">數(shù)值</param>/// <returns>耗費(fèi)時(shí)間</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;}} }總結(jié)
以上是生活随笔為你收集整理的【斐波那契数列】算法优化笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: geoserver2.15安装教程
- 下一篇: 【两数之和】算法优化笔记