資料結構 5 遞迴

2021-09-22 18:32:56 字數 3067 閱讀 8890

3. 練習

遞迴就是子程式(或函式)直接呼叫自己或通過一系列呼叫語句間接呼叫自己,是一種描述問題和解決問題的基本方法。

遞迴常與分治思想同時使用,能產生許多高效的演算法。遞迴常用來解決結構相似的問題。所謂結構相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規模小,並且依賴第一部分的結果。

實際上,遞迴是把乙個不能或不好解決的大問題轉化成乙個或幾個小問題,再把這些小問題進一步分解成更小的小問題,直至每個小問題都可以直接解決。因此,遞迴有兩個基本要素:

(1) 邊界條件:確定遞迴到何時終止,也稱為遞迴出口。

(2) 遞迴模式:大問題是如何分解為小問題的,也稱為遞迴體。

遞迴函式只有具備了這兩個要素,才能在有限次計算後得出結果。

def

fib(n)

:if n==

0or n==1:

return n

return fib(n-1)

+fib(n-

2)

def

factorial

(n):

if n<=1:

return

1return n*factorial(n-1)

factorial(

5)

# 可用包 【自帶的庫itertools.permutations】獲取子集的全排列

count=

0def

perm

(n,begin,end)

:global count

if begin>=end:

print

(n) count +=

1else

: i=begin

for num in

range

(begin,end)

: n[num]

,n[i]

=n[i]

,n[num]

perm(n,begin+

1,end)

n[num]

,n[i]

=n[i]

,n[num]n=[

1,2,

3,4]

perm(n,0,

len(n)

)print

(count)

[

題目描述

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是乙個正整數。

示例 1:

輸入: 2

輸出: 2

解釋: 有兩種方法可以爬到樓頂。

1 階 + 1 階

2 階示例 2:

輸入: 3

輸出: 3

解釋: 有三種方法可以爬到樓頂。

1 階 + 1 階 + 1 階

1 階 + 2 階

2 階 + 1 階

解題思路

設dp[i]表示到達點第i層時有多少種方法,而到達第i層可以由i-1層跳一層上去,也可以由i-2層跳兩層上去,那麼狀態轉移矩陣可以寫為:

**實現

class

solution

:def

climbstairs

(self, n:

int)

->

int:

dp =[0

]*nif n ==1:

return

1 dp[0]

=1dp[1]

=2for i in

range(2

,n,1):

dp[i]

= dp[i-1]

+dp[i-2]

return dp[-1

]

[

題目描述

陣列的每個索引做為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 costi。

每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。

示例 1:

輸入: cost = [10, 15, 20]

輸出: 15

解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。

示例 2:

輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]

輸出: 6

解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。

注意:cost 的長度將會在 [2, 1000]。

每乙個 cost[i] 將會是乙個integer型別,範圍為 [0, 999]。

**實現

class

solution

:def

mincostclimbingstairs

(self, cost: list[

int])-

>

int:

n =len(cost)

dp =[0

]*ndp[0]

= cost[0]

dp[1]

= cost[1]

for i in

range(1

,n):

dp[i]

=min

(dp[i-1]

, dp[i-2]

)+ cost[i]

return

min(dp[-1

],dp[-2

])

5 資料結構 遞迴

將原來的問題,轉化為更小的同一問題 計算arr l.n 這個區間內所有數字的和 private static int sum int arr,int l public static void main string args system.out.println sum nums 36 1.鍊錶的天...

資料結構實驗5 遞迴

編寫遞迴演算法int max int a,int left,int right 求陣列a left.right 中的最大數。include arrayio.h 請將本函式補充完整,並進行測試 int max int a,int left,int right int main 請編寫乙個遞迴演算法函式...

資料結構 5 鍊錶與遞迴

鍊錶元素刪除問題的解答問題描述 在鍊錶 1,2,6,3,4,5,6 中刪除值為 6 的元素 遞迴 計算機中的很重要的元件邏輯機制 鍊錶具有遞迴性質 public listnode removeelementnew listnode head,int val 處理子鍊錶,分解問題 two head.n...