在某群看到,
趣味题:
编写原型为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); }
void foo(int i ,int n)
{
for(int x = i;x <= 2*n-i;x++)
printf("%d ",n-abs(n-x));
}
what about this
你都没看完题目要求T_T
呃 看到了 只能有一个分号,我错了
我一开始没看到只能使用一个printf的时候,我就直接
printf(“%d “, i), foo(i+1, n), printf(“%d “, i);
虾哥,你这结束条件是什么啊?
哈哈,被你发现了!!!我打漏了,中间的应该是 i!=n ? foo(i+1, n) : 0
不要卖关子。。。
不想一下子贴出答案,影响大家思考的机会!!!
话说,iceboy给出了一个很简短的方法,但是又不易理解。
Pingback引用通告: 趣味题 | Wandai Blog
应小虾小动物滴要求,上来贴代码~
void foo(int i, int n)
{
//不用返回值都可以做;
printf(“%d “, i == n ? i : (foo(i, i), foo(i + 1, n), i));
}
强~~~
还以为 iceboy 那个写得比较短了,没想到还有这个不用返回值的版本……不过一样难理解。
其实我也不想用返回值 -_- :
int foo(int i, int n)
{
return printf(“%d “, i), (i<n)&&foo(i+1, n), (i!=n)&&foo(i, i), 0;
}
算比较好理解了,分两个判断。
呃。。。好像我的写法,也可以去掉return的 🙂
不用?:的话大概就无法避开return了吧?感觉返回的int值就是为了&&和||运算用滴。。。
你错啦,你看
void foo(int i, int n){
i==n && printf(“%d “, i) || (foo(i, i), i
int foo(int i, int n)
{
return printf(“%d “, i), i<n ? foo(i+1, n), foo(i, i) : 0 ;
}
牛……看来和我的只是一步之差,我竟然没发现…… Orz
犀利!!!写法跟楼上的那个很相似。
Pingback引用通告: C语言趣味题一 » SXKDZ[DCS]