作者barry800414 (小铭)
看板b98902HW
标题[计程] 递回格式
时间Tue Nov 17 12:15:51 2009
(设计对白)
A:我知道这题要用递回,阿可是,不知道函式里面要写什麽耶...
B:为什麽跑出 "回报此问题","不回报" 了 = _ =
---------------------------------------------------------------
如果你有上面的困扰,可以参考看看这个格式
这是一位B97的学长教我的,我觉得还蛮实用的,所以PO出来给大家参考
int Function(
1.参数区 )
{
2.条件判断区
3.递回区
}
1.参数区:
通常会放与递回有关的参数,例如:座标、层数、index、必要资讯等等,
以判断我递回到哪里了,是否该停止会跟参数有很大的关系
2.条件判断区:
这是非常重要的地方,这里要放一些条件的判断,判断递回是否该停止,或者跳过某
些层数,或者已经跑到我要的层数,我要输出了。
3.递回区:
真正自己呼叫自己的地方,通常这里也会有一个或以上条件的判断,以确定是否符合
题目要求,是否呼叫函式。
---------------------------------------------------------------------------
举例来说: The Dictionary (单班期中 双班好像也有考)
http://judgegirl.csie.org/~c2009/2009mid2/3.htm
首先把原字串照字典顺序排序後
开始写函式了
(L是题目要求输出的长度,N是字串S长度,str是排序後字串,buf暂时存答案)
char str[100];
char buf[10];
int L,N;
void Findans(int layer) 参数区,这题因为只有一维,所以一个
{ "层数"的参数就够了
int i;
if(layer==L){
这里就是条件判断区了,当我layer跑到L,
buf[layer]='0'; 就代表,我已经跑了第0,1,2..L-1层共L层
printf("%s\n",buf); 也就是任务完成,不用再递回,输出呗!
}
else{
for(i=0;i<N;i++){ 这里就是递回区,这题因为是全排列,每个都需
if(Check()==1){ 试试看,所以放了一个for loop。
buf[layer]=str[i]; 这里Check()就是检查有没有符合题意,有的话
Findans(layer+1); 就进行下一层
}
}
}
return ;
}
int main()
{
Findans(0);
return 0;
}
把其他该补上的程式码补上这题就OK了 =) (#include main() Check() )
当然,没有一个方法是万能的,题目变化多端,整个递回式还是要看题目而调整,
不过我觉得学长教了我这东西以後,我想递回真的有快了一点,也比较有方向,
不致於完全卡住不知道该写什麽,所以可以参考看看。
------------------------------------------------------------------------
关於什麽时候该用递回,我会这样想:
1.以上面的题目为例,其实如果L固定是3,我可以写三层回圈,检查完,符合题意的
就输出。
但是L是变动的,我们没办法告诉电脑我要跑几层,而且万一层数是100层,
或者是层数跟测资有关系,无法马上确定,写不出来。
那常常就可以想到"递回"。
我只要告诉电脑我哪时候该停止、哪时候进行下一层(呼叫自己)就可以了。
2.或者是像单班功课 Machine 这一题
http://groups.google.com.tw/group/ntucsie-c2009/web/homework-3?pli=1
我想要的答案是个大问题(大机器的成本),而这个大问题需要好多小问题(较小机器的
成本)来回答我,我才能回答。而小问题又需要小小问题的答案....,这种形式的题目
常常就可以想到递回!
我设定function回传的值是我想要的资讯、条件判断区判断多小的问题是直观解决的,
直接回传。
(这题是"" The cost of machine A, B, and C of size 1 are x, y, and z. ""
这句话告诉了我们 size 1的cost是多少)
把参数放好、递回区写好,就可以解决这一题了 = )
当然可能还有很多@@,不过我一时也想不到,(强者可以补上)。
不过也不是什麽题目都给他递回下去,能够用while解决就用while
毕竟递回颇浪费空间、也容易发生没注意到的情况而无限递回下去。
大家加油!
--
A stoo a day keeps bad grades away
Just keep it !
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.241.197
※ 编辑: barry800414 来自: 140.112.241.197 (11/17 12:19)
1F:推 zxm20243:睡醒第一推!教学好文XD 11/17 13:41
2F:→ ckclark:字典题有人还是有写了五层回圈AC的高手XD 11/17 14:25
3F:推 andy74139:推推!! 11/17 15:21
4F:推 lmr3796:递回只应天上有 11/17 16:20
5F:推 jimmyken793:凡人应当用回圈 11/18 09:03