修改後的程式如下
開發平台(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