遞迴 堆和棧

2022-06-13 19:42:08 字數 887 閱讀 6263

標籤(空格分隔): c 雙學位高階語言程式設計 c函式

把規模較大的,較難解決的問題轉化後才能規模較小的、易於解決的同類子問題。

規模較小的子問題又轉化為規模更小的子問題,且小到一定程度可以直接得出它的解(遞迴的基本條件,又名終止條件、出口),從而得到原始問題的解。

後進先出,先進後出

自頂向下移動指標

由於這個結構,函式呼叫時常用棧儲存資料,叫做函式呼叫棧。

遞迴函式呼叫中,每一次都會更新函式呼叫棧中的資料。所以,每執行一次遞迴時,都會更新一次堆疊資料,運算會多計算一倍以上,所以遞迴時空效率偏低,易產生大量的重複計算。

什麼叫「尾遞迴」?當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於任何表示式的一部分(即在回歸階段不需要任何計算)時,這種遞迴呼叫就是尾遞迴。

我們先來看兩段求階乘的**

//**1:普通遞迴

long fact(int n)

//**2:尾遞迴

long fact(int n,int a)

**一為普通遞迴,計算複雜度更高。例如,像計算4!,它會先計算1!,再2!,3!,4!,因為返回值層層巢狀,每次乘以對應的n,對應的計算是4!=1*2*3*4;**二為尾遞迴,每次都已經執行完了上乙個函式任務。如上例,函式在每次遞迴時,並沒有計算n乘以a,而是計算n乘以a。

從棧的分配上來說,**一為普通遞迴,如果想要計算4!,就必須要計算3!,3!到2!,2!到1!,由於每次任務都未完成,所以必須要儲存每次的棧針,而且退出失也要依次退出,這會堆疊很高的棧,容易資料溢位;而**二為尾遞迴,每次任務都已經完成了計算,計算結果儲存在a中,輸出時一下子釋放所有棧針,所以最後輸出時不需要儲存原棧針,節省了大量記憶體空間。

關於堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

關於堆和棧

網上找到的,有什麼不對的大家指出來,重新學習 1.棧是存放函式返回位址 引數 區域性變數的。堆是程式可以自由操作的記憶體,使用時先申請,用完之後釋放,如何使用完全由程式 控制。2.棧在彙編 中表示成push pop,用的是ess段,sp暫存器 而堆不是,是在記憶體中讀寫,eds段,3.c 包括兩種被...

了解堆和棧

程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回...