遞迴和棧溢位。

2022-03-13 17:01:20 字數 1398 閱讀 5040

遞迴確實是很多演算法的基礎思想。但外部因素導致遞迴會棧溢位。

但卻是不甘心如此簡練的有效的演算法,放棄不用。

所以一般有2中方式來使用大資料的遞迴思路

1)用棧型別放入引數,模擬遞迴呼叫。

2)把大資料分割為一批適中的資料,就可以直接使用遞迴函式。

用快速排序,測試並總結了下。

1)本例大概 排序30000個數字,遞迴就溢位。

2)用區域性變數的棧型別。也不超過90000個數字。 不知道為什麼,看來要看下stack的實現。

3)棧型別用指標,放入堆中。到此問題解決。

#include

#include

using namespace std;

void quicks(int* left,int* right);

void quicks2(int* left,int* right);

int main()

;for(int i=90000-1;i!=-1;--i)

quicks2(intarray,intarray+90000-1);

// for(int i=0;i!=9;++i)

//

//遞迴

void quicks(int* left,int* right)

*comparep=temp;

++comparep;}}

quicks(left,comparep-1);

quicks(comparep+1,right);

}else}//

//注意2點.

//遞迴總體就2個情況.遞迴呼叫和到達臨界點.一般是if else.

//所以2中情況的結尾.都相當於函式執行了一次.那麼.

//1)臨界點,需要pop.相當於一次函式返回.

//2)非臨界點, 在呼叫遞迴前.也必須pop一次.本來是放在呼叫後面,也就是函式結束.但是這裡不是遞迴,語句不會執行完遞迴,返回這裡.

//所以必須在在模擬遞迴前先模擬函式返回.

void quicks2(int* left,int* right)

*comparep=temp;

++comparep;}}

//原一次遞迴呼叫完畢,函式返回時,會返回到上一層函式,這裡必須在模擬遞迴前先模擬函式返回.

recursion_stack->pop();

recursion_stack->pop();

//模擬遞迴

recursion_stack->push(comparep-1);

recursion_stack->push(left);

//模擬遞迴

recursion_stack->push(right);

recursion_stack->push(comparep+1);

}else}}

棧溢位和棧記憶體溢位

棧記憶體溢位是指使用者棧的大小最多為8 10mb,分配超過棧大小的變數則會導致棧記憶體溢位。如char c 1024102411 11mb 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。如char c 10 memset c...

遞迴呼叫的棧溢位

如下 include include int recurse int x int main int argc,char ar 22執行結果如下 hxl hxl virtual machine 桌面 task code r 100 x 100.a at 0x7ffcfce0afd0 x 99.a at...

什麼是棧溢位和堆溢位

棧溢位是由於c語言系列沒有內建檢查機制來確保複製到緩衝區的資料不得大於緩衝區的大小,因此當這個資料足夠大的時候,將會溢位緩衝區的範圍。堆溢位的產生是由於過多的函式呼叫,導致呼叫堆疊無法容納這些呼叫的返回位址,一般在遞迴中產生。堆溢位很可能由無限遞迴 infinite recursion 產生,但也可...