EMC小有难度的笔试,撰写仅有一行的语句的函数???
weckay
EMC小有难度的笔试,撰写仅有一行的语句的函数???
函数原形已经给出:int p(int i, int N);
功能:调用该函数,打印如下格式的输出,例p(1, 7);
1
2
3
4
5
6
7
6
5
4
3
2
1
即每行一个数字。(注意:N只打印一次)
要求:
函数中唯一能够调用的函数就是printf。
只使用一条语句,如果你真的不能用一条语句,每增加一条语句扣1分。
不准使用如下的关键字:typedef, enum, do, while, for, switch, case, break, continue, goto,
until, if, ..具体很多我也忘了,反正能用的不多。
不能使用逗号表达式和?:表达式。
标准:(总分10分)
1. 每多一条语句扣1分,即每多一个;就扣1分
2. 每使用一次if或?:扣2分
3. 每使用一次for,while, swith各扣4分
大体上就是如上的要求了。
[[i] 本帖最后由 weckay 于 2007-4-2 15:15 编辑 [/i]]
flw
很明显就是想让递归嘛。不过原型给得不清楚,没有描述参数语义。下面我假设 N 是指数字的个数而不是截止数。
[code]int p( int i, int N ){
return ( N && printf( "%d/n", i ) && p( i+1, N-1 ) && ( N != 1 && printf( "%d/n", i ) ) ) + 1;
}[/code]
lenovo
[quote]原帖由 [i]flw[/i] 于 2007-4-2 14:57 发表
很明显就是想让递归嘛。不过原型给得不清楚,没有描述参数语义。下面我假设 N 是指数字的个数而不是截止数。
[code]int p( int i, int N ){
return ( N && printf( "%d/n", i ) &&am ... [/quote]
好牛。:mrgreen:
weckay
这个N好像题目中就没有说清楚是上限还是个数,也可能是我忘记了。原题就是给的p(1, 7)这个例子,所以通过给的示例也不能判断出N的具体用意。不过这个应该影响不大吧,可以相互转换的吗
Edengundam
打(i, N)范围的....
[code]
return ((N == i) && printf("%d/n", i)) || ((N > i) && printf("%d/n", i) && p(i + 1, N) && printf("%d/n", i)) || (printf("None/n"));
[/code]
weckay
我想起来了,N应该是上限。我记得原题中有一句话是这样的up to N and then down to i.
flw
稍微简化了一下:
[code]int p( int i, int N ){
return ( printf( "%d/n", i ) && N > 1 && p( i+1, N-1 ) && printf( "%d/n", i ) ) + 1;
}[/code]
to 6 楼:你那个也可以简化的。
flw
[quote]原帖由 [i]weckay[/i] 于 2007-4-2 15:39 发表
我想起来了,N应该是上限。我记得原题中有一句话是这样的up to N and then down to i. [/quote]
如果是这样的话,那这个函数的原型就给得非常恶心。
如果是我,我会给出 [code]int p( int min, int max );[/code]
Edengundam
[quote]原帖由 [i]flw[/i] 于 2007-4-2 15:42 发表
稍微简化了一下:
[code]int p( int i, int N ){
return ( printf( "%d/n", i ) && N > 1 && p( i+1, N-1 ) && printf( "%d/n", i ) ) + 1;
}[/code]
... [/quote]
恩.....我只能这样了..
[code]
return (N >= i) && printf("%d/n", i) && (N > i) && p(i + 1, N) && printf("%d/n", i);
[/code]
weckay
斑竹说的有道理,这还是EMC全国统一考试的最后一题呢。太随便了
cobras
[code]
int p(int i, int N) {
return i <= N && (printf("%d/n", i) && p(i + 1, N) || i < N && printf("%d/n", i)) && 0;
}
[/code]
飞灰橙
[code]
int p (int i, int N)
{
return i < 2*N && printf ("%d/n", N - (N-i) * (2*(i<N)-1) ) && p (i+1, N);
}
[/code]
修正一下,加個return
[[i] 本帖最后由 飞灰橙 于 2007-4-2 17:52 编辑 [/i]]
bigapple2008
只能说EMC的人才如用有问题,这种题目个人觉得没啥意思啊
InfoHunter
[quote]原帖由 [i]Edengundam[/i] 于 2007-4-2 15:51 发表
恩.....我只能这样了..
[code]
return (N >= i) && printf("%d/n", i) && (N > i) && p(i + 1, N) && printf("%d/n", i);
[/code] [/quote]
错了,应该是这样:
[code]
return (N >= i) && printf("%d/n", i) && (N > i) && p(i + 1, N) & printf("%d/n", i);
[/code]
最后一个printf前应该是&,否则每次p(i + 1, N)返回的都是假,这样&&运算符短路,不会执行最后的printf了,也就无法输出6.....1了
Edengundam
[quote]原帖由 [i]InfoHunter[/i] 于 2007-4-2 21:47 发表
错了,应该是这样:
[code]
return (N >= i) && printf("%d/n", i) && (N > i) && p(i + 1, N) & printf("%d/n", i);
[/code]
最后一个prin ... [/quote]
恩, 确实搞错了,我倾向学flw的办法. 比 & 语意稍微明确一点.
[code]
return ((N >= i) && printf("%d/n", i) && (N > i) && p(i + 1, N) && printf("%d/n", i)) + 1;
[/code]
不过还是最开始写的语意上明确...:em06:
lee2008
[quote]原帖由 [i]InfoHunter[/i] 于 2007-4-2 21:47 发表
错了,应该是这样:
[code]
return (N >= i) && printf("%d/n", i) && (N > i) && p(i + 1, N) & printf("%d/n", i);
[/code]
最后一个prin ... [/quote]
怎么就是没看懂,后半部分的6 5 4 3 2 1 是怎么生成的啊?
:em14:
InfoHunter
[quote]原帖由 [i]lee2008[/i] 于 2007-4-3 08:28 发表
怎么就是没看懂,后半部分的6 5 4 3 2 1 是怎么生成的啊?
:em14: [/quote]
典型的递归,还是用p(1,7)来说
当i= 6时,调用p(7,7),递归进入p,这时(N > i)为假,返回假,回到p(6,7),这时i = 6,然后执行最后的printf("%d/n", i),打印出6,类推得到5.....1
流程:
p(1,7)
p(2,7)
....
p(7,7)
p(6,7)
...
p(1,7)
lee2008
[quote]原帖由 [i]InfoHunter[/i] 于 2007-4-3 09:15 发表
典型的递归,还是用p(1,7)来说
当i= 6时,调用p(7,7),递归进入p,这时(N > i)为假,[color=Red]返回假,回到p(6,7),[/color]这时i = 6,然后执行最后的printf("%d/n", i),打印出6,类推得到5.....1
流程:
p( ... [/quote]
我就是这里没搞明白, 怎么回到p(6,7)的? i是如何自减的啊?:em14: