刷題知識點突破 遞迴函式

2021-10-07 11:29:03 字數 979 閱讀 8633

碰到這個問題 是在22題 括號生成

需要對括號做有序生成,其中應用了遞迴函式十分簡潔,我還不能充分掌握這種表達方式。特此學習記錄。

class

solution

:def

generateparenthesis

(self, n:

int)

-> list[

str]

: ans =

defbacktrack

(s, left, right):if

len(s)==2

* n:

''.join(s)

)return

if left < n:

'(')

backtrack(s, left+

1, right)

s.pop(

)if right < left:

')')

backtrack(s, left, right+1)

s.pop(

) backtrack(

,0,0

)return ans

程式描述 第一次流程,給棧中壓進n個"(「然後壓入n個」)"

函式在內部呼叫自身,就是遞迴函式。

可以看到 遞迴函式有迴圈的特質

理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。

使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。可以試試fact(1000)

尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只占用乙個棧幀,不會出現棧溢位的情況。

刷題知識點

加速輸入輸出流,放到 頭部 static const auto speedup 陣列初始化容器 int a vector b begin a end a map操作 include include using namespace std int main void else 刪除 iterator ...

刷題小知識點

二維陣列的指標寫法 include using namespace std int main for int i 0 i 3 i cout a 1 2 endl system pause return 0 char a 10 則最後乙個必須是 0 前面9個數 char a 多維陣列最後一維必須有值。...

python leetcode刷題知識點筆記2

第一種方法 bfs廣度優先搜尋,使用雙端佇列deque 因為效能比另外兩種queue好得多 在大迴圈內對二叉樹的每個層做一次遍歷,range len queue 使只遍歷當前的層,每次大迴圈ans加1。由於每個節點僅訪問一次,所以時間複雜度o n import collections class s...