步驟:
(1)找出基線條件,這種條件必須盡可能簡單。相當與遞迴的終止條件。
在處理列表時,基線條件很可能是空陣列或只包含乙個元素
(2)不斷將問題分解(或者說縮小規模),直到符合基線條件
// 問題:乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法?
// 1. 遞迴
public
intf
(int n)
else
}// 2. 備忘錄法
//陣列的大小根據具體情況來,由於int陣列元素的的預設值是0
//因此我們不用初始化
int[
] arr =
newint
[1000];
public
intf
(int n)
else
else}}
// 3. 自底向上
public
intf
(int n)
return sum;
}
是否有狀態重複計算的,可不可以使用備忘錄法來優化。
是否可以採取遞推的方法來自底向上做,減少一味遞迴的開銷。
大多數應該運用於一維題目中,例如字串、一維陣列相關的題,可以考慮使用分治的方法
例題1:二路歸併排序
# 二路歸併排序 遞迴
# 兩兩合併,分治
defmerge
(arr, left, mid, right)
: i = left
j = mid
res =
while i < mid and j < right+1:
if arr[i]
> arr[j]:)
j = j +
1else:)
i = i +
1while i < mid:
) i = i +
1while j < right +1:
) j = j +
1 p =
len(res)
for k in
range
(p):
arr[left+k]
= res[k]
defmergesort
(arr, left, right)
:# 基準因子, 當只剩乙個元素時, 直接返回
if left >= right:
return
mid = right +
int(
(left - right)/2
)# 左邊陣列進行歸併排序
mergesort(arr, left, mid-1)
# 右邊陣列進行歸併排序
mergesort(arr, mid, right)
# 判斷公升序時返回
if arr[mid-1]
<= arr[mid]
:return
merge(arr, left, mid, right)
程式設計師內功修煉序列
程式設計師內功修煉序列 來自 panqiaomu 內功修煉比如演算法,資料結構,設計模式等,沒有了這些,做軟體開發只能浮於表面,是很難有質的突破的。有了深厚的內功,就像張無忌,看見別人剛打出的武功招式瞬間就學會了並且能反制敵人,這就或許就是tao吧。o o.此書架對2人裡的2人有用 對你有用 無用計...
修煉演算法內功 選擇排序(一)
內容 1 簡單的選擇排序 2 使用模板 泛型 使演算法更加靈活 3 使用結構體完成學生的name和score屬性的排序 4 隨機生成演算法測試用例。寫在前面 為什麼學習o n 2 的排序演算法?基礎 1 selection sort 選擇排序 基本思路 如 8 6 2 3 1 5 7 4 對乙個序列...
C 內功修煉 物件導向概述
物件導向三大特性?物件導向的三個基本特徵是 封裝 繼承 多型。封裝封裝最好理解了。封裝是物件導向的特徵之一,是物件和類概念的主要特性。封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。繼承物件導向程式設計 oop 語言的乙個主要功能就...