內功修煉 遞迴 分治

2021-10-23 02:41:11 字數 1571 閱讀 8680

步驟:

(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 語言的乙個主要功能就...