推 pizza0117:太感謝了 不會難懂 清楚明瞭 我知道怎麼做了 謝謝^^ 12/11 18:42
※ 引述《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)