我在寫遞迴的時遇到了一個問題
因為遞回太大,造成stack overflow
不知道遇到這個問題有解嗎
除了用for迴圈改寫以外
有沒有什麼遞回可以用heap阿...或是修改編譯器的大小的方法呢...囧
2006-06-19 17:05:23 · 4 個解答 · 發問者 wwd 2 in 電腦與網際網路 ➔ 程式設計
我之前也是遇到這個問題,
不過我是因為 Recursive 的 function 會交叉測試到同一點的值,
假設有 n 個點,每點我設一個 flag 初值為 0,在每走訪到一點就令該點 flag 為 1 ,
並增加判斷式該點 flag 為 1 時不得走訪。
只是說說我的經驗,,, 上次也有聽說可以修改 stack size,,,
不過我找不到XD
加油!
2006-06-21 01:37:09 補充:
問一下,你是不是要做pixel的分群啊?看你的問題感覺蠻像的ㄋㄟ @_@
2006-06-19 19:34:46 · answer #1 · answered by dsewnr 3 · 0⤊ 0⤋
不才之愚見,惠請斧正。recursive function的層數過深,導致stack overflow,相信寫演算法程式的人多少會碰到。由於不才孤陃寡聞,不知如何調整stack大小之參數,故另想它法。不才以為,stack 內主要存放乃activation record,若將recursive function 之引數及其區域變數絕大部分另以全域陣列變數作為虛擬堆疊另外存放,似可減少stack之使用量!?不知足下之意如何?
另者,function body使用code segment,此與stack segment較無關連。
2006-06-21 12:06:59 補充:
見龍大之言,不才心中有感,一吐為快,期與諸大共勉!
龍大之意見,語重而心長,誠乃我輩之良訓!程式設計苦海無涯,好的思考方向勝過枝微未節之技巧多矣,適用的思考邏輯對問題之解決速矣!
吾於此道凡二十餘載,先聖先賢不以愚劣,常以其金言妙語點醒,所謂與君一席話,勝讀十年書。子曰三人行必有我師,龍大為師,可謂盡心盡力而無愧矣!
2006-06-20 09:05:11 · answer #2 · answered by Diamond Liu 7 · 0⤊ 0⤋
我懂了^^
因為我現在在寫區域成長法
圖片太大要用到太大的遞回
你可以把你說的放在回答裡^^
沒人在送點
剛剛也把引數用掉還是滿溢了..
(不知道觀念有沒有錯,函式本身也會站空間吧)
感謝你的回答,現在還在繼續研究中
我也查過很久了
應該也是沒其他方法了...
2006-06-19 18:56:12 · answer #3 · answered by wwd 2 · 0⤊ 0⤋
你若要用遞迴你就會用到stack.因你執行一個函式時,傳引數會用到stack.函式裡的變數也會用到stack. 在函數裡呼叫其它函數也會用到stack.而呼叫函式時所需要的stack數量就要看你傳多少引數, 函式裡有多少變數了, 函式裡呼叫了多少函數.你若因遞迴太大,造成stack overflow.那先檢查你的程式是否有問題.若無問題,你有好幾種解法
1.改成迴圈.(這你以講過了)
2.減少引數,函式裡的變數,和不在函式裡呼叫其它的函式.也就是說用全區域變數代替.這樣可減少呼叫函式時所需要的stack數量.不過用此法,你只能減少stack的使用量.只治標而不治本
2006-06-19 21:53:13 補充:
據我所知,呼叫函式時若會用到記憶體,就一定會用到stack而不會用到heap.
懂不懂?不懂請再問
2006-06-20 00:12:21 補充:
你懂了就好啦.
若有問題請再問
2006-06-21 01:21:04 補充:
ok,如果你是用VC++的話,你可在編譯時用/F來設定stack的大小.例: /F 1000000
或在link時用/STACK來設定stack的大小
如果你是用VC++的話,你可在編譯時用-Wl,--stack=
再強調一下,增加stack的大小和減少函式裡使用stack的次數這些辦法雖然有可能解決你的問題,但是只治標而不治本.最好的方法應是改成迴圈,再來是改進遞迴的次數.
2006-06-22 02:52:32 補充:
過獎過獎.以俺之才,討論尚可,稱師論道,難能勝任.
2006-06-19 17:53:05 · answer #4 · answered by 龍 7 · 0⤊ 0⤋