1. 程式人生 > >Fibonacci演算法實現的幾種方法

Fibonacci演算法實現的幾種方法

公式:F(n) = F(n-1) + F(n-2)

假設第一個數是0,第二個數是1

1.迭代加法:

long long fabonacci_first(int n) {
	long long a = 0, b = 1;
	if (n == 1) return a;
	else if (n == 2) return b;
	else {
		for (int i = 3; i <= n; i++) {
			b = a + b;
			a = b - a;
		}
		return b;
	}
}

2.利用陣列先儲存數字,直接返回結果,耗費空間:

long long fabonacci_second(int n) {
	long long arr[50];
	arr[1] = 0; arr[2] = 1;
	for (int i = 3; i < 100; i++) 
		arr[i] = arr[i-1] + arr[i-2];
	return arr[n];
}

3.二分遞迴,由於每次都需要重新計算,損耗大量時間和空間,時間複雜度O(2^n):

long long fabonacci_third(int n) {
	if (n == 1) return 0;
	else if (n == 2) return 1;
	else return fabonacci_second(n-1) + fabonacci_second(n-2); 
}

4.尾遞迴:

long long fabonacci_fourth(long long first, long long second, int n) { //傳入時first = 0,second = 1 
	if (n == 1) return first;
	else if (n == 2) return second;
	else if (n == 3) return first + second;
	else return fabonacci_fourth(second, first + second, n - 1);
}

5.備忘錄法,使用遞迴方法,但利用陣列來儲存來避免重複計運算元問題:

long long arr[100];

long long fibonacci_fifth(int n) {
	if (arr[n] > 0) return arr[n];
	if (n == 1) return 0;
	if (n == 2) return 1;
	arr[n] = fibonacci_fifth(n-1) + fibonacci_fifth(n-2);
	return arr[n];
}

相關推薦

Fibonacci演算法實現方法

公式:F(n) = F(n-1) + F(n-2) 假設第一個數是0,第二個數是1 1.迭代加法: long long fabonacci_first(int n) { long long a = 0, b = 1; if (n == 1) return a;

DIV實現垂直居中的方法

水平居中 好的 parent 間接 z-index -c 實現 解決 ble 說道垂直居中,我們首先想到的是vertical-align屬性,但是許多時候該屬性並不起作用。例如,下面的樣式並不能達到內容垂直居中顯示 1 div { 2 width:200px;

javascript實現異步的方法(一)

.com 順序 單線程 -s .html done 耦合 ogr nbsp 你可能知道,Javascript語言的執行環境是"單線程"(single thread)。 所謂"單線程",就是指一次只能完成一件任務。如果有多個任務,就必須排隊,前面一個任務完成,再執行後面一個任

QT下實現對Linux Shell調用的方法

nes running qprocess -o test main new rest ring 使用QProcess QThread ============================================ #include <QProcess&

CSS實現下拉菜單的方法

ansi display ora ble 下拉 技術 body round too PS:轉自https://www.cnblogs.com/yewenxiang/p/6064117.html 第一種:display:none和display:block切換 1 &l

java算法面試題:排序都有哪方法?請列舉。用JAVA實現一個快速排序。選擇冒泡快速集合至少4方法排序

算法 err div println rda print 算法面試 ++ 快速排序 package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util

css實現垂直居中的方法

定位 方法 cell 方式 middle ali ddl 顯示 內容 方法1、這個方法把一些 div 的顯示方式設置為表格,因此我們可以使用表格的 vertical-align 屬性。 #wrapper { //代表父元素 display: table; }

C#中實現並發的方法的性能測試

返回 也不會 thead syn image 9.png 結果 次數 存在 原文地址:https://www.cnblogs.com/durow/p/4837746.html 0x00 起因 去年寫的一個程序因為需要在局域網發送消息支持一些命令和簡單數據的傳輸,所以寫了

浮動子div撐開父div的方法、給select賦值、zoom樣式的含義、實現select下拉框readonly

disable hid 對象 居中 使用說明 child react back for 1.浮動子div撐開父div的幾種方法: (1)在父div中在添加一個清除浮動的子div<div style=" clear:both;"></div>,該div

純CSS實現垂直居中的方法

right lin 兼容 bar 實現 syntax info pro ems 垂直居中是布局中十分常見的效果之一,為實現良好的兼容性,PC端實現垂直居中的方法一般是通過絕對定位,table-cell,負邊距等方法。有了css3,針對移動端的垂直居中就更加多樣化。 方法1:

C語言經典演算法(七)——遞迴實現階乘演算法的兩方法

今後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現階乘演算法N! 1、 遞迴實現n! <1> 題目描述:輸入n值,求解n的階乘 <2> 方法一:累乘法 <3> 方法二:遞迴法 原始碼: 一、 遞迴實現n! 1、 累乘法 #

【JS】深拷貝與淺拷貝的區別,實現深拷貝的方法

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。 此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝。 我們來舉個淺拷貝例

js中實現跨域的方法

js中幾種實用的跨域方法原理詳解 這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向一個不同的域請求資料,或者通過js獲取頁面中不同域的框架中(iframe)的資料。只要協議、域名、埠有任何一個不同,都被當作是不同的域。 下表給出了相對http://sto

Java單例模式實現方法

package offer; public class Test02 { /** * 01 餓漢模式 執行緒安全 */ public static class Singleton{ private final static Singleton

Leetcode|Longest Palindromic Substring(最長迴文的方法)(Manacher演算法

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there ex

Python實現簡單的排序演算法

一.氣泡排序 概念:為一個無序的列表排成有序的 實現過程描述:(升序)   1.比較相鄰的元素,如果第一個比第二個大,就交換他們的位置   2.對每一對相鄰元素重複1的工作,從開始第一隊到最後一對,最後結束的時候最大的數會在後面   3.針對所有元素重複1,2的工作,除了最後一個數,因為最後的數最大

SpringBoot---系統啟動載入實現方法

1.CommandLineRunner  通過實現介面 CommandLineRunner 來實現,來完成專案啟動就載入所需要的資源。 import org.springframework.boot.CommandLineRunner; import org.springfra

Vue 實現雙向繫結的方法

1. v-model 指令 <input v-model="text" /> 上例不過是一個語法糖,展開來是: <input :value="text" @input="e => text = e.target.value"

實現一個元素在當前視窗垂直水平居中的方法

首先我這裡介紹了簡單的六種方法,以後如果遇到更好的也會補充,也歡迎大家可以來補充!     <div class="wrap">            <div class="bo

Fibonacci方法討論

1.用定義的遞迴演算法 f(n)=f(n-1)+f(n-2) 指數級別,因為不斷的重複計算,很多冗餘 public static int Fibonacci1(int n) { if (n<=1) return n; return Fibonacci1(n-1)+Fibona