再談遞迴與迴圈
/**
* 遞迴實現
* */
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 遞迴呼叫僅僅是被調函式正好是主調...