作者ledia (下班後才下棋)
看板C_and_CPP
标题Re: [问题] stack -> loop
时间Fri Dec 11 16:03:56 2009
※ 引述《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)
1F:推 pizza0117:太感谢了 不会难懂 清楚明了 我知道怎麽做了 谢谢^^ 12/11 18:42