《演算法之美》 遞迴 數值型

2021-10-04 06:04:39 字數 3074 閱讀 6129

為什麼是數學歸納法?

/**

有個小孩正在上樓梯,樓梯有n階台階,小孩一次可以上1階、2階、3階。

請實現乙個方法,計算小孩有多少種上樓的方式。

為了防止溢位,請將結果mod 1000000007

給定乙個正整數int n,請返回乙個數,代表上樓的方式數。

保證n小於等於100000。

*/public

class

_9_1走樓梯

/** * n較小的時候就會超時

* @param n

* @return

*/public

static

long

recursion1

(int n)

// 1 2 4 7 13 24 44

public

static

intrecursion2

(int n)

return x3;

}public

static

intrecursion3

(int n),,

};long

f1f2f3 =};

return

(int

) util.

matrixmultiply

(f1f2f3, util.

matrixpower

(base, n -1)

)[0]

[0];

}}

recursion2中(推薦用這種)

*

* 有乙個x*y的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。

請設計乙個演算法,計算機械人有多少種走法。

給定兩個正整數int x,

int y,請返回機械人的走法數目。保證x+y小於等於12。 */

public

class

_9_2機械人走格仔

/** * 遞迴形式

* @param x

* @param y

* @return

*/public

static

intsolve

(int x,

int y)

/** * 迭代形式

* @param m

* @param n

* @return

*/public

static

intsolve1

(int m,

int n)

for(

int i =

1; i <= m; i++

)for

(int i =

2; i <= m; i++)}

return state[m]

[n];

}}

過程如下圖所示

/**

* 假設我們有8種不同面值的硬幣{1,2,5,10,20,50,100,200},用這些硬幣組合構成乙個給定的數值n。

* 例如n=200,那麼一種可能的組合方式為 200 = 3 * 1 + 1*2 + 1*5 + 2*20 + 1 * 50 + 1 * 100.

[華為面試題] 1分2分5分的硬幣三種,組合成1角,共有多少種組合

1*x + 2*y + 5*z=10

[創新工廠筆試題] 有1分,2分,5分,10分四種硬幣,每種硬幣數量無限,給定n分錢,有多少組合可以組成n分錢

1 5 10 25 分 n,多少種組合方法.

*/public class _9_8硬幣表示_經典

} int

state;

/*遞推解法*/

public

int countways1(

int n) ;

int[

] dp = new int[4

][n +1]

;//前i種面值,組合出面值j

for(

int i =

0; i <

4; i++)

for(int j =

0; j < n +

1; j++)

for(int i =

1; i <

4; i++) }}

return dp[3]

[n];

} /*遞推解法*/

public

int countways2(

int n) ;

int[

] dp = new int

[n +1]

; dp[0]

=1;for

(int i =

0; i <

4; i++)

}return dp[n]

; }

/*遞推解法--二維陣列--推薦*/

public

int waystochange(

int n) ;

int[

] res = new int[4

][n+1]

;for

(int i =

0; i <= n; i++)

for(int i =

0; i <

4; i++)

for(int i =

1; i <

4; i++)

else }}

return res[3]

[n];

}/*遞迴形式*/

public

int countways(

int n) ,3)

; }

private int countwayscore(

int n,

int[

] coins,

int cur)

return res;

}}

演算法之美 遞迴與迭代

演算法之美 遞迴與迭代 其實遞迴最大的有點就是把乙個複雜的演算法分解成若干相同的可重複的步驟。所以,使用遞迴實現乙個計算邏輯往往只需要很短的 就能解決,並且這樣的 也比較容易理解。但是,遞迴就意味著大量的函式呼叫。函式呼叫的區域性狀態之所以用棧來記錄的。所以,這樣就可能浪費大量的空間,如果遞迴太深的...

泛型演算法之數值演算法 numeric標頭檔案 詳細介紹

數值演算法屬於泛型演算法,定義在標頭檔案numeric中 數值演算法要求輸入迭代器,如果演算法輸出資料,則使用輸出迭代器表示目的位置 定製 除iota外,數值演算法都提供了過載版本 即用謂詞代替預設運算子的自定義版本 1 accumulate accumulate beg,end,init accu...

資料結構與演算法之美 8 遞迴演算法

遞迴嚴格說起來不算一種演算法,只能說是一種問題處理思想或者問題處理技巧。只要問題同時滿足以下三個條件,就可以考慮用遞迴來解決 乙個問題的解可以分解為幾個子問題的解 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 存在遞迴終止條件 個人覺得,寫遞迴 最關鍵的是寫出遞推公式,找到終止條件...