遞迴轉迭代實操記錄

2022-05-06 14:18:12 字數 1085 閱讀 7691

針對那些經典的畫素遊戲設計的自動切圖工具裡用到種子填充演算法的實現。

一開始是用遞迴實現的,後來遇到一些頭像之類的比較大一點的圖素,執行的時候經常佔滿c#預設的1m執行緒棧記憶體而崩潰。嘗試使用各種多線方式改造並沒有成功,於是乾脆改成迭代形式,建立乙個stack自己完全精確控制其中的資料操作。

這裡擷取一段改成迭代後的**,這是窗體的事件處理用cs**。因為只是個小工具,沒有完全把介面和邏輯分離。

private const int maxstackframes = 640 * 480;

private stackmstack = new stack(maxstackframes);

private void fillregion(int x, int y)

);mstack.push(new fillstackframe() );

mstack.push(new fillstackframe() );

mstack.push(new fillstackframe() );

mstack.push(new fillstackframe() );

mstack.push(new fillstackframe() );

mstack.push(new fillstackframe() );

mstack.push(new fillstackframe() );}}

}}

}總結一下遞迴轉迭代的操作步驟:

初始化函式呼叫前用到的類的成員變數和常量,放在類的成員變數或者常量直接初始化就可以。

初始化在本次呼叫不變的資料比如這裡的延伸距離distance,放在進入迭代迴圈之前。

把遞迴函式的引數合成乙個型別frame,建立乙個stack來代替執行時提供的棧記憶體。這個stack根據具體情況可以是類的成員變數也可以是函式的區域性變數。

壓入初始的傳入引數幀

進入迭代迴圈,迭代迴圈基本就是原本函式的遞迴執行體改造過來。

迭代迴圈中把所有遞迴呼叫自身的函式換成新引數構建成幀並且壓入stack。

原有的return改成對迭代迴圈的continue。

如果有跳出所有原來遞迴的需要,在迭代迴圈中加入break。

其他操作順序維持不變。

cmakelists實操記錄

cmake help command set qc include usr include amss set qc include usr include amss core check environment variables if env strequal 可以將其想象成乙個配置檔案 在uni...

GitLab 實操記錄

目錄 一.gitlab上傳實操 報錯 git master branch has no upstream branch 報錯 failed to push some refs to h 二.精通git 閱讀筆記 提交本地 到遠端倉庫 修改遠端倉庫位址 三.prop 1.通過 babel 和 webp...

XMLPULL解析個人實操記錄

xmlpull解析個人實操記錄 基於android 6.0 準備xml資料文件 訪問位址為電腦本機位址 完成解析某個節點 case xmlpullparser.end tag break default break eventtype xmlpullparser.next catch excepti...