《計算機基礎與程式設計》第7周學習總結

Alphl發表於2024-11-10

學期(2024-2025-1) 學號(20241428) 《計算機基礎與程式設計》第7周學習總結

作業資訊

|這個作業屬於哪個課程|<班級的連結>(如[2024-2025-1-計算機基礎與程式設計](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP|)|
|-- |-- |
|這個作業要求在哪裡|<作業要求的連結>(如2024-2025-1計算機基礎與程式設計第一週作業)|
|這個作業的目標|陣列與連結串列 基於陣列和基於連結串列實現資料結構|
|作業正文|https://i.cnblogs.com/posts/edit|

教材學習內容總結

子程式與引數
定義和作用:
子程式可以是函式(Function)或過程(Procedure),函式通常返回一個值,而過程則不返回值。
子程式允許程式設計師將複雜的操作分解成更小、更易於管理的部分。
呼叫和返回:
子程式透過呼叫語句被執行,執行完畢後返回到呼叫點繼續執行。
函式在執行完畢後會返回一個值給呼叫者,而過程則不會。
引數(Parameters):
引數是傳遞給子程式的值,用於影響子程式的行為。
引數可以是輸入引數(傳入值)、輸出引數(傳出值)或輸入輸出引數(傳入傳出值)。
引數傳遞方式:
按值傳遞(Pass by Value):子程式接收引數的副本,對引數的修改不會影響原始資料。
按引用傳遞(Pass by Reference):子程式直接操作引數的記憶體地址,對引數的修改會影響原始資料。
過載(Overloading):
允許建立多個具有相同名稱但引數列表不同的子程式,這有助於提供更清晰的API和簡化程式碼。
作用域(Scope):
子程式內部定義的變數通常具有區域性作用域,即它們只能在子程式內部訪問。
全域性變數可以在程式的任何地方訪問,包括子程式內部。
遞迴(Recursion):
遞迴是一種特殊的子程式呼叫,其中子程式直接或間接地呼叫自身。
遞迴需要有一個明確的終止條件,否則會導致無限遞迴。
棧幀(Stack Frame):
每次呼叫子程式時,都會在呼叫棧上建立一個新的棧幀,用於儲存區域性變數和引數。
當子程式返回時,其對應的棧幀會被銷燬。
尾呼叫最佳化(Tail Call Optimization, TCO):
尾呼叫是指子程式呼叫是函式體中的最後一個操作。
尾呼叫最佳化是一種編譯器最佳化技術,可以避免為尾呼叫建立新的棧幀,從而減少棧空間的使用。
閉包(Closures):
閉包是函式和其周圍狀態(詞法環境)的組合,允許函式訪問定義在其外部的變數。
這些知識點是程式設計中子程式和引數的基礎,不同的程式語言可能會有不同的實現細節和特性。
連續記憶體分配:

陣列在記憶體中分配一塊連續的空間來儲存資料元素。
隨機訪問:

陣列支援透過索引進行快速隨機訪問,訪問時間複雜度為O(1)。
固定大小:

靜態陣列的大小在定義時確定,不可更改。
動態陣列(如C++中的std::vector或Java中的ArrayList)可以調整大小,但通常需要分配新的記憶體塊並複製舊資料。
插入和刪除操作:

在陣列的開頭或中間插入或刪除元素通常需要移動大量元素,時間複雜度為O(n)。
空間利用:

陣列可能會預留額外空間以支援動態擴充套件,這可能導致空間的浪費或不足。
快取友好性:

陣列的連續記憶體分配使得快取利用率高,有助於提高效能。
適用場景:

適用於元素數量基本確定且需要頻繁隨機訪問的場景。
基於連結串列的資料結構
非連續記憶體分配:

連結串列中的每個元素(節點)可以獨立分配在記憶體的任何位置。
順序訪問:

連結串列只能透過從頭節點開始順序訪問,訪問特定節點的時間複雜度為O(n)。
動態大小:

連結串列的大小可以隨時改變,插入和刪除操作不需要移動其他元素。
插入和刪除操作:

在連結串列的任意位置插入或刪除節點只需要改變指標,時間複雜度為O(1),但前提是已經定位到該位置。
空間利用:

連結串列不需要預留額外空間,但每個節點需要額外儲存指向前一個或後一個節點的指標,可能會增加儲存開銷。
快取友好性:

連結串列的非連續記憶體分配可能導致快取未命中,影響效能。
適用場景:

適用於元素數量頻繁變化且順序訪問的場景,如實現棧、佇列等。
常見基於陣列和連結串列的資料結構
陣列實現:

陣列列表(ArrayList)
雜湊表(如C++中的std::unordered_map)
字串(在某些語言中,如C/C++)
連結串列實現:

單連結串列
雙向連結串列
迴圈連結串列
雜湊連結串列(開放定址法)
棧(可以使用陣列或連結串列實現)
佇列(可以使用陣列或連結串列實現)

教材學習中的問題和解決過程(先問 AI)



相關文章