看板 C_and_CPP 關於我們 聯絡資訊
修改後的程式如下 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C ( 使用 Code-Blocks ) 問題(Question): 請教板上的大大們,我在寫排列組合時,使用 recursion 遇到區域變數的問題 下面有錯誤的程式碼 ps. debug 後,有找到錯誤的原因,但是無法理解 >"< ------------------------------------------ 程式錯誤原因: main() 裡面的 j 和 permutation 裡面的 i 會佔用相同的記憶體 導致 main() 的 for loop 形成 infinite loop ( 預期 main 裡面的 j 執行的狀況:0, 1, 2, 3, 跳出 for loop 實際 main() 裡面的 j 執行的狀況: 0, 1, 2, 1, 2, 1, 2.........) 目前解決的辦法: 將 main() 裡面的 local variable j 設成 global variable j 就可以解決 但是不知道為什麼不同 function 的變數會佔用相同的記憶體 我也沒有用 pointer 傳遞變數 >"< 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #define MAX 3 #define FLIP(x) ((x) == 0 ? (x = 1) : (x = 0)) void permutation(int arr[], int sub, int count, int index); int main(void) { int list[MAX] = {0}; int j; for(j = 0; j <= MAX; j++){ permutation(list, j, 0, 0); } return 0; } void permutation(int arr[], int sub, int count, int index) { int i; /* if(index > MAX) return; */ if(sub == count){ for(i = 0; i < MAX; i++) printf("%d ", arr[i]); printf("\n"); return; } if(index >= MAX) return; FLIP(arr[index]); permutation(arr, sub, count + 1, index + 1); FLIP(arr[index]); permutation(arr, sub, count, index + 1); } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.62.58 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1422151550.A.D99.html
LPH66: index > MAX 這裡錯了, 宣告 [MAX] 的陣列只能存取 [MAX-1] 01/25 10:08
LPH66: 存取 [MAX] 時會存取到不該取的位置, 你這裡正好被 j 使用 01/25 10:08
LPH66: 所以在 FLIP 的時候就會寫入 1 或 0 01/25 10:09
LPH66: 最後跳出迴圈時 j 就會以為它才剛數完 0 01/25 10:09
LPH66: 所以它其實不是跟 i 一樣而是跟 [MAX] 一樣 01/25 10:10
easyget: 感謝大大啦,太強了~~~困擾我 1 個小時都還摸不著頭緒 01/25 11:25
※ 編輯: easyget (36.231.42.148), 01/30/2015 22:34:58