看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《pizza0117 (阿水~*)》之銘言: : #define LIST_SIZE EDGE_SIZE : #define NEVER_USE -1 : 補充說明: : 我想知道改成LOOP的話怎麼處理這部分 : CheckNumber[i] = ListIndex; : SetLabel(NumberList,ListIndex+1,CheckNumber); : CheckNumber[i] = NEVER_USE; 所謂的 recursive 之所以好用 是因為有些需要記下來的東西 我們透過各層 recursive 中 function 的變數存下來 以你的 SetLabel 來說 偷偷存下來的就是 i 註: : for(i=0; i<LIST_SIZE; i++) : { : if(CheckNumber[i] == NEVER_USE) ^^^ 這一個 i 值 : { : NumberList[ListIndex] = i+1; : CheckNumber[i] = ListIndex; : SetLabel(NumberList,ListIndex+1,CheckNumber); : CheckNumber[i] = NEVER_USE; : } : } 你在這邊透過 function call 的特性 記錄下了第 ListIndex 層目前嘗試到了第 i 個數字 等之後的 SetLabel(NumberList,ListIndex+1,CheckNumber); 執行完畢 再回到這一層時, 我們就能很方便的繼續原本的 for loop 從第 i+1 個數字繼續往後面嘗試 因此, 把 recursive 改成 loop 就是想辦法把這個記起來的資訊用自己的 stack 去模擬 取代原本 function call 幫我們自動做好的方式 這裡我從你的程式改起, 自己記資訊的 stack 剛好可以用你的 "NumberList" 這個 array (因為這個 array 記載了第幾層前一次用到了哪個數字) 因此, 這邊的改法可能會變成這樣: http://nopa.csie.org/50d3a 最重要的是原本 recursive 的回傳或呼叫 這邊改成用 ListIndex--; 或 ListIndex++; 加上 continue 來模擬 而中間 for loop 的部份則改成: for(i=NumberList[ListIndex]+1;i<LIST_SIZE;i++) 表示我們從這一層的下一個待嘗試的數字開始試下去 希望改得不算太難看懂 ^^| -- 有時候,遺忘,是令人快樂的。什麼時候?當然是有人傷了你的心的時候。  存心傷你的那個人,固然是故意和你過不去,但是被傷了心而耿耿於懷的你  ,卻是和自己過不去了。所以,記性不好的人,通常會是比較快樂的人,也  是比較不容易被擊倒的人。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.50 ※ 編輯: ledia 來自: 140.112.30.50 (12/11 16:05)
pizza0117:太感謝了 不會難懂 清楚明瞭 我知道怎麼做了 謝謝^^ 12/11 18:42