Xiaoxia[PG]

一道C语言趣味题

我的代码17 条评论

在某群看到,

趣味题:
编写原型为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);
}

17 条评论

  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

    1. 你都没看完题目要求T_T

      1. 呃 看到了 只能有一个分号,我错了

        1. 我一开始没看到只能使用一个printf的时候,我就直接
          printf("%d ", i), foo(i+1, n), printf("%d ", i);

          1. 虾哥,你这结束条件是什么啊?

            1. 哈哈,被你发现了!!!我打漏了,中间的应该是 i!=n ? foo(i+1, n) : 0

  2. 不要卖关子。。。

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

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

    1. 还以为 iceboy 那个写得比较短了,没想到还有这个不用返回值的版本……不过一样难理解。
      其实我也不想用返回值 -_- :
      int foo(int i, int n)
      {
      return printf("%d ", i), (i<n)&&foo(i+1, n), (i!=n)&&foo(i, i), 0;
      }
      算比较好理解了,分两个判断。

      1. 呃。。。好像我的写法,也可以去掉return的 🙂

        1. 不用?:的话大概就无法避开return了吧?感觉返回的int值就是为了&&和||运算用滴。。。

          1. 你错啦,你看
            void foo(int i, int n){
            i==n && printf("%d ", i) || (foo(i, i), i<n && foo(i+1, n), foo(i, i));
            }

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

    1. 牛……看来和我的只是一步之差,我竟然没发现…… Orz

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

引用本文的文章

发表评论

评论会经过自动审核,链接请勿超过 3 个。