离奇的code

贼,打印数字题

2008年10月14日 阅读(67)

哎 无聊小孩在bbs上改的无聊题 偏巧碰上了无聊的我

输入一个数字,比如说5
请输出一个数字三角形,顶端为5,如下
0
01
012
0123
01234
012345
01234
0123
012
01
0
写一个函数完成上面的功能
要求:不使用任何形式的循环语句,包括用goto实现的循环也不行 
      if-else 
      逗号操作符
      函数只能由一个语句组成
以前看过类似的题目,今天忽然心血来潮想给自己增加一下难度
不知道大家有没有什么想法,最好贴一下代码,^_^

ps:我不保证一定有办法解出来…

下面是我的解答,保存一下,本来想用纯递归的生成,最后还是利用了一点平面坐标的东西

。。。如果是只允许一个参数,比较夸张,实现的话估计比较难,maybe hacer memery
写了一个很难看懂的,^o^,函数有两个参数
没用?:,用了短路求值,用?:应该更简单些
bool w(int i,int N){
    return (i > 2*N*N) ||((i%N <= i/N && i%N + i/N <= 2*(N-1) && (printf("%d ",(i)%N) == -1 || ((i%N == i/N || i%N + i/N == 2*(N-1))&&printf("\n"))   ) && (i < -1)) || w(++i,N) );
}

如果求5,请输入w(0,6);求7,调 w(0,8);
另外如果你自己都不知道能不能解的题,还是别出的好。。。

 

其实过程是这样的,一开始写出循环,然后写出递归程序,最后把递归程序消掉
      不使用if-else
      不使用逗号操作符

 一般可以利用&& ||的短路特性,消除条件语句,同时可以保证执行的等价性。

另外?:也是可以代替if else的功能的。

实际的递归程序是这样的:

void w(int i,int N){
    if(i > 2*N*N)return;
    if(i%N <= i/N && i%N + i/N <= 2*(N-1)){
        printf("%d ",(i)%N);
        if(i%N == i/N || i%N + i/N == 2*(N-1))
                printf("\n");
    }
   w(++i,N);
}

 

 

You Might Also Like