引言
算法調試常比編寫更耗時,尤其是動態規劃、遞歸等邏輯復雜的代碼。本文分享一套系統化的調試方法,幫助快速定位問題。
一、調試前的準備
代碼格式化
使用統一縮進(4 空格)和命名規范,避免因格式混亂導致的邏輯誤讀。邊界條件枚舉
提前列出測試用例:空輸入、n=1、n = 最大值等極端情況。
二、動態規劃調試技巧
打印 DP 表
對區間 DP,輸出dp[i][j]
的中間結果,檢查是否符合預期:// 調試時添加 for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << dp[i][j] << "\t";}cout << endl; }
驗證子問題
以石子合并為例,先手動計算 n=3 的情況,對比程序輸出是否一致。三、遞歸調試技巧
添加日志輸出
記錄遞歸參數和返回值,追蹤調用路徑:int dfs(int step, int l, int r) {cout << "call dfs(" << step << "," << l << "," << r << ")" << endl;// ... 邏輯 ...int res = ...;cout << "return " << res << endl;return res; }
- 限制遞歸深度
防止棧溢出,在調試時添加深度判斷:if (step > 1000) {cerr << "可能棧溢出" << endl;exit(1); }
四、常見 BUG 類型與對策
數組越界
使用assert(i >= 0 && i < n)
在關鍵位置添加斷言。初始化錯誤
對 DP 數組,確保初始值正確(如dp_min
初始化為inf
,dp_max
初始化為 0)。循環邊界錯誤
用小數據測試循環變量范圍,如i < n
還是i <= n
。- GDB 調試器:設置斷點、單步執行、查看變量
- Visual Studio Code:集成調試功能,支持變量監視
- Online Judge:提交前用 OJ 的測試用例驗證
- ?