兔子數列的不同實現方式

2021-10-07 08:46:03 字數 1704 閱讀 9815

public

class

demo

;// 遞迴實現 重複子問題處理過多

system.out.

println

(rec_opt

(arr, arr.length -1)

);// 15

// 動態規劃實現

system.out.

println

(dp_opt

(arr));

// 15

// 兔子數列 遞迴實現

system.out.

println

(rec_fib(45

));// 45 --- 1134903170

// system.out.println(rec_fib(1000));// 1000 --- 運算不出來 可能得加記憶體條

// 兔子數列 動態規劃實現

system.out.

println

(dp_fib(45

));// 45 --- 1134903170

system.out.

println

(dp_fib

(1000))

;// 1000 --- 817770325994397771

// 總結

// 遞迴是從大到小求運算,動態規劃是從小向大求運算

// 將所有子問題值儲存,進而避免重複運算

// 是兩種解決問題的思想

}// 遞迴求解

public

static

intrec_opt

(int

arr,

int i)

if(i ==1)

// 選擇狀態 本下標值和非相鄰前乙個數的最優解

int a =

rec_opt

(arr, i -2)

+ arr[i]

;// 不選擇 前乙個數的最優解

int b =

rec_opt

(arr, i -1)

;// 返回選擇和不選擇 兩種狀態的最優解

return

max(a, b);}

// 動態規劃求解

public

static

intdp_opt

(int

arr)

// 返回陣列最後一項

return optarr[optarr.length -1]

;}// 返回兩個數最大值

public

static

intmax

(int a,

int b)

// 兔子數列 遞迴實現

public

static

intrec_fib

(int n)

return

rec_fib

(n -1)

+rec_fib

(n -2)

;}// 兔子數列 動態規劃實現

public

static

long

dp_fib

(int n)

opt[i]

= opt[i -1]

+ opt[i -2]

;}// 返回陣列最後一項

return opt[opt.length -1]

;}}

對兔子數列的理解

斐波那契在1202年寫成了著作 計算之術 中提出了這樣乙個問題 在第乙個月有一對剛出生的小兔子,在第二個月小兔子變成大兔子並開始懷孕,第三個月大兔子會生下一對小兔子,並且以後每個月都會生下一對小兔子。如果每對兔子都經歷這樣的出生 成熟 生育的過程,並且兔子永遠不死,那麼兔子的總數是如何變化的?通過下...

自動布局的不同實現方式

autolayout自動布局 三種方式新增約束 1.介面操作 2.手寫 3.視覺化格式語言 方式1在屬性框中輸入相應的屬性值即可 注意屬性的衝突設定與屬性缺失 方式2 求算公式 redview.height self.view.top 0.2 20 給redview新增頂部間距約束,相對於self....

用費布拉契數列實現迭代演算法 兔子問題

上 古典問題 有一對兔子,從出生後第四個月起每個月都生一對兔子,小兔子長到第四個月後每個月又生一對兔子。假如兔子都不死,計算第十個月兔子的總數?用 表示這個過程 所經過的月數12 3456 78910 兔子總對數11 2358 1321 3455 迭代結構圖 print 輸入有誤!return 0 ...