24九/1117
一道C语言趣味题
在某群看到,
趣味题:
编写原型为int foo(int i, int n)的c函数,实现打印i,i+1,...,n-1,n,n-1,...,i+1,i的序列。要求函数内只能有一条语句,只能有一个分号,只能有一个printf,并且只能用这个printf输出。不允许使用if、else、do、for、while、goto关键字。
没有给出参考答案。下面是我自己写的一个方法。
int foo(int i, int n){
return i==n ? printf("%d ", i) : (foo(i, i), i<n ? foo(i+1, n) : 0, foo(i, i));
}
展开后如下:
int foo(int i, int n){
return i==n ?
printf("%d ", i)
: (
foo(i, i),
i<n ?
foo(i+1, n)
:
0,
foo(i, i)
)
;
}
要是 ? : 的三目运算也不给用,可用如下这样写,
int foo(int i, int n){
return i==n && printf("%d ", i) || (foo(i, i), i<n && foo(i+1, n), foo(i, i));
}
下面是iceboy的方法,是不是有点难理解
int foo(int i, int n){
return i < n && foo(i, i) && foo(i + 1, n), printf("%d ", i);
}


2011年09月24日 22:54
void foo(int i ,int n)
{
for(int x = i;x <= 2*n-i;x++)
printf("%d ",n-abs(n-x));
}
what about this
2011年09月24日 23:15
你都没看完题目要求T_T
2011年09月24日 23:26
呃 看到了 只能有一个分号,我错了
2011年09月24日 23:52
我一开始没看到只能使用一个printf的时候,我就直接
printf(“%d “, i), foo(i+1, n), printf(“%d “, i);
2011年09月25日 01:48
虾哥,你这结束条件是什么啊?
2011年09月25日 02:25
哈哈,被你发现了!!!我打漏了,中间的应该是 i!=n ? foo(i+1, n) : 0
2011年09月24日 23:21
不要卖关子。。。
2011年09月24日 23:31
不想一下子贴出答案,影响大家思考的机会!!!
话说,iceboy给出了一个很简短的方法,但是又不易理解。
2011年09月25日 14:08
应小虾小动物滴要求,上来贴代码~
void foo(int i, int n)
{
//不用返回值都可以做;
printf(“%d “, i == n ? i : (foo(i, i), foo(i + 1, n), i));
}
2011年09月25日 17:01
强~~~
2011年10月12日 10:20
还以为 iceboy 那个写得比较短了,没想到还有这个不用返回值的版本……不过一样难理解。
其实我也不想用返回值 -_- :
int foo(int i, int n)
{
return printf(“%d “, i), (i<n)&&foo(i+1, n), (i!=n)&&foo(i, i), 0;
}
算比较好理解了,分两个判断。
2011年10月12日 12:12
呃。。。好像我的写法,也可以去掉return的
2011年10月12日 17:00
不用?:的话大概就无法避开return了吧?感觉返回的int值就是为了&&和||运算用滴。。。
2011年10月13日 12:53
你错啦,你看
}
void foo(int i, int n){
i==n && printf(“%d “, i) || (foo(i, i), i
2011年09月26日 11:27
int foo(int i, int n)
{
return printf(“%d “, i), i<n ? foo(i+1, n), foo(i, i) : 0 ;
}
2011年10月12日 10:23
牛……看来和我的只是一步之差,我竟然没发现…… Orz
2011年09月28日 14:25
犀利!!!写法跟楼上的那个很相似。