資料結構與演算法 再談遞迴與迴圈(斐波那契數列)

2021-10-22 09:37:07 字數 3096 閱讀 2722

再談遞迴與迴圈

/**

* 遞迴實現

* */

public

long

addfrom1n

(long n)

/** * 迴圈實現

* */

public

long

addform1n_interative

(long n)

long result=0;

for(

long i =

1; i < n; i++

)return result;

}

案例分析:斐波那契數列

f

(n)=

f(n-1)

+f(n-2

), n>1f

(n)=

0, n=0f

(n)=

1, n=

1

斐波那契數列遞迴實現
/**

我認為的最優解:動態規劃(迴圈實現)

/**

* 動態規劃求值

* */

public

static

long

getfibonaccigreat

(int n)

if(n ==

1l|| n ==2l)

long answer =1l;

long last =1l;

long nextlast =1l;

for(

long i =

0l; i < n -

2; i++

)return answer;

}

時間複雜度更優o(logn)但是複雜度過於高的解法 [f(

n)f(

n−1)

f(n−

1)f(

n−2)

]=[1

110]

n−1\left[ \begin f(n) &f(n-1) \\ f(n-1) & f(n-2) \end \right] = \left[ \begin 1 & 1 \\ 1 & 0 \end \right] ^

[f(n)f

(n−1

)​f(

n−1)

f(n−

2)​]

=[11

​10​

]n−1

/**

* 矩陣物件定義

* @author liaojiamin

* @date:created in 15:21 2021/3/16

*/public

class

matrix2by2

public

matrix2by2

(long m00,

long m01,

long m10,

long m11)

public

long

getm_00()

public

void

setm_00

(long m_00)

public

long

getm_01()

public

void

setm_01

(long m_01)

public

long

getm_10()

public

void

setm_10

(long m_10)

public

long

getm_11()

public

void

setm_11

(long m_11)}*

** 獲取斐波那契數列

*@author liaojiamin

*@date

:created in 12:06

2021/2

/2*/

public

class

fibonacci

/** * 矩陣乘方實現

* */

public

static

matrix2by2

matrixpower

(int n)

matrix2by2 matrix =

newmatrix2by2()

;if(n==1)

else

if(n%2==

0)else

if(n%2==

1)return matrix;

}public

static

long

getfibonaccibest

(int n)

if(n <=0)

if(n ==1)

matrix2by2 powernminus2 =

matrixpower

(n-1);

return powernminus2.

getm_00()

;}public

static

void

main

(string

args)

}

解法比較

變種題型

資料結構 遞迴與迴圈

需要重複多次計算相同的問題,通常可以選擇用遞迴或者迴圈兩種不同的方法,遞迴是在函式內部用函式自身,迴圈則是通過設定計算的初始值及終止條件,在乙個範圍內重複運算。通常遞迴會比迴圈 簡潔,更加容易實現。遞迴也有著顯著的缺點 1.遞迴由於是函式呼叫自身,而函式呼叫是有時間和空間的消耗 每一次函式呼叫都需要...

資料結構與演算法 遞迴

一 概念 遞迴是一種高效 簡介的編碼技巧,一種應用很廣泛的演算法,比如dfs深度優先搜尋,前中後序二叉樹遍歷等都是使用遞迴。方法或函式呼叫自身的方式成為遞迴呼叫,呼叫稱為遞,返回成為歸 所有遞迴問題都可以用遞迴公式來表示 二 遞迴優缺點 優點 簡潔 缺點 堆疊溢位風險 可根據調整遞迴呼叫的最大深度來...

資料結構與演算法 認識遞迴

淺識 1 遞迴與迴圈 理論上,任何迴圈都可以重寫為遞迴形式 有些語言沒有迴圈語句,只能使用遞迴。2 迴圈改遞迴 1 發現邏輯 相似性 2 一定要有 出口 不然就會死迴圈 3 構造相似性 如果沒有明顯的相似性,可能是缺少引數,需要主動構造,與遞推類似 4 遞迴呼叫 1 遞迴呼叫僅僅是被調函式正好是主調...