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 ...