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

一道C语言趣味题》有19个想法

        1. Xiaoxia 文章作者

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

          回复
    1. Xiaoxia 文章作者

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

      回复
  1. Pingback引用通告: 趣味题 | Wandai Blog

  2. 兔子

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

    回复
    1. Taro

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

      回复
  3. Pingback引用通告: C语言趣味题一 » SXKDZ[DCS]

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据