在函式的定義中對這個函式自身的呼叫,就是遞迴。
遞迴結構中,遞迴的部分必須比原來的整體簡單,才有可能到達某種終結點(出口)。而且必須存在非遞迴的基本結構構成的部分,否則會無限遞迴。
學習目標:程式設計實現斐波那契數列求值 f(n)=f(n-1)+f(n-2)
程式設計實現求階乘 n!
程式設計實現一組資料集合的全排列leetcode 46. 全排列
leetcode 47. 全排列 ii
leetcode 70. 爬樓梯
以上問題都可以用遞迴來解決。
斐波那契數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。
[0,1,1,2,3,5,8,13,...] 給定n,計算 f(n)
方法15class :
def fib(self, n: int) -> int:
if n <= 1:
return n
return self.fib(n-1) + self.fib(n-2)
動態規劃方法參見:動態規劃
求階乘 n!1
8def factorial(n):
if n == 0 or n == 1:
return 1
else:
return (n*factorial(n-1))
a = factorial(3)
print(a)
輸出:6
leetcode 46. 全排列
給定乙個沒有重複數字的序列,返回其所有可能的全排列。
示例輸入: [1,2,3]輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
方法每次選擇乙個數出來,然後把剩下的數,再選擇乙個出來,依次類推,選到頭,就回溯到上一層。1
11class :
def permute(self, nums: list[int]) -> list[list[int]]:
res =
def dfs(nums = nums, path = ):
if not nums:
for i in range(len(nums)):
dfs(nums[:i]+nums[i+1:], path+[nums[i]])
dfs()
return res
leetcode 47. 全排列 ii
給定乙個可包含重複數字的序列,返回所有不重複的全排列。
示例:輸入: [1,1,2]輸出: [ [1, 1, 2], [1, 2, 1], [2, 1, 1] ]
方法相比上一題,多了排序和內部的重複判斷。1
14class :
def permuteunique(self, nums: list[int]) -> list[list[int]]:
nums.sort()
res =
def dfs(nums = nums, path=):
if not nums:
for i in range(len(nums)):
if i>0 and nums[i] == nums[i-1]:
continue
dfs(nums[:i]+nums[i+1:], path+[nums[i]])
dfs()
return res
leetcode 70. 爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是乙個正整數。
示例 :1
6輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階
方法:遞迴
當有n個台階時,可供選擇的走法可以分兩類:1,先跨一階再跨完剩下n-1階;2,先跨2階再跨完剩下n-2階。所以n階的不同走法的數目是n-1階和n-2階的走法數的和。 這和斐波那契數列的規律相同,可以用這個思路。1
9class :
def climbstairs(self, n):
:type n: int
:rtype: int
if n<=2:
return n
return self.climbstairs(n-1) + self.climbstairs(n-2)
這個方法執行正常,但是因為超出時間限制,未能通過。
方法:動態規劃
動態規劃來記錄歷史資料。1
10class :
def climbstairs(self, n):
:type n: int
:rtype: int
prev, current = 0, 1
for i in range(n):
prev, current = current, prev + current
return current
python實現遞迴演算法
usr bin env python coding utf 8 def recursive 1 n 樓梯有n階台階,上樓可以一步上3階,也可以一步上5階,計算共有多少種不同的走法?設n階台階的走法數為f n 如果台階數小於等於3,走法有2種 一步上3個台階或者5個台階 即f n 3 2 如果台階數為...
Python 實現遞迴演算法
1 遞迴的定義 遞迴就是子程式 或函式 直接呼叫自己或通過一系列呼叫語句間接呼叫自己,是一種描述問題和解決問題的基本方法。遞迴常與分治思想同時使用,能產生許多高校的演算法。遞迴常用來解決結構相似的問題。所謂結構相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的...
python遞迴 演算法 遞迴(Python解釋)
通俗一點來說,遞迴就是一種在函式內呼叫自己的演算法。每一級呼叫都會有自己的引數。每一次呼叫都會有一次返回。可能是返回自己,繼續遞迴 也可能是返回特定值,結束遞迴。遞迴解釋 優點 直觀,實現簡單,可讀性好。缺點 會有重複的呼叫 優化裡會說明 占用空間大,遞迴太深,會造成棧溢位 呼叫太多,不給你呼叫了 ...