作者chhsiao (bye~)
看板b96902HW
标题Re: [使徒] 来点提示好了 ;p
时间Sun Oct 28 22:31:15 2007
有些同学把 code 寄给我, 问我 code 哪里有问题,
不过结果常常是通篇都有问题 XD
下面是我回某同学的内容, 希望对大家有帮助 :)
---
我觉得你的想法应该还没完全弄清楚,
要不然就是你还不会用 C 这个语言去 "说" 你的想法.
传多少个参数不是重点,
我也可以写出完全不用传参数的递回.
重要的是要先把递回关系明确定义出来,
再用 C 语言按照定义写出来.
你想用只传一个参数的话, 我想到的有两种比较直观的递回式:
1. pick(current) 代表 "决定第 current 个 guest 要不要取":
pick(current) =
(1) if current == N then output the selection.
(2) if current < N then
(a) select the current guest,
update veriables which should be changee by this selection,
call pick(current + 1) to complete the selection,
then restore variables which have been changed by this selection.
(b) DO NOT select the current guest,
just call pick(current + 1) to complete the selection.
2. pick(current) 代表 "决定第 current 取的人是谁":
pick(current) =
(1) if current == sum then output the selection.
(2) if current < sum then
let k be the pervious selected id + 1, or the first id if current == 0.
for all k'th, (k+1)'th, (k+2)'th, ..., N'th id,
try each id as the current selection,
update variables which should be changed by this selection,
call pick(current + 1) to complete the selection,
then restore variables which have been changed by this selection.
注意一下, 题目不仅要求输出的列表要排序,
连不同列表之间也要按顺序输出喔!
例如 1 2 4 5 7 一定要在 1 3 4 5 6 之前输出.
由於不同的递回呼叫顺序会造成不同的输出顺序,
因此用正确的递回顺序就可以直接做到.
比方说
假设 1 已经选了, 那我们只要能够在递回选择时,
确保 "第二个选 2" 比 "第二个选 3" 还要早发生,
那输出顺序一定就对了.
希望这对你有帮助.
--
n;main(i){return n?i<2?i:main(i-1)+main(i-2):
scanf("%d",&n)&&printf("%d\n",n>0?main(n):0);}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.54
1F:推 yangmie:请问第8组测资是特别机车的吗?其他组都过了...只差1... 10/28 23:01
2F:推 greenoyster:比较大 10/28 23:20
3F:推 chhsiao:啊 这样很大喔? XD 10/28 23:50
4F:推 DarkKnightX:这样很大喔? XD 10/29 00:16
5F:推 BNMAA: 这样很大喔? XD 10/29 00:59
6F:→ BNMAA:errata 1. (1)-(a) com'p'lete 10/29 00:59
※ 编辑: chhsiao 来自: 140.112.30.54 (10/29 01:27)
7F:推 chhsiao:Corrected. 10/29 01:27