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:

yulc
好久没来,一来又见强贴。

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:

doni
递归是想到了,要我一下子做出,恐怕有难度

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: