Xiaoxia[PG] Yesterday is history, tomorrow is mistery, today is a gift!

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);
}

喜欢这个文章吗?

考虑订阅我们的RSS Feed吧!

评论 (17) 引用 (2)
  1. void foo(int i ,int n)
    {
    for(int x = i;x <= 2*n-i;x++)
    printf("%d ",n-abs(n-x));
    }
    what about this

  2. 不要卖关子。。。

    • 不想一下子贴出答案,影响大家思考的机会!!!
      话说,iceboy给出了一个很简短的方法,但是又不易理解。

  3. 应小虾小动物滴要求,上来贴代码~
    void foo(int i, int n)
    {
    //不用返回值都可以做;
    printf(“%d “, i == n ? i : (foo(i, i), foo(i + 1, n), i));
    }

  4. int foo(int i, int n)
    {
    return printf(“%d “, i), i<n ? foo(i+1, n), foo(i, i) : 0 ;
    }

  5. 犀利!!!写法跟楼上的那个很相似。


Leave a comment

(required)