今天没什么事情看了看cu的精华区, 好好学习一下了:
---------------------
函数原形已经给出:int p(int i, int n);
功能:调用该函数,打印如下格式的输出,例p(1, 7);
1
2
3
4
5
6
7
6
5
4
3
2
1
即每行一个数字。(注意:n只打印一次)
要求:
函数中唯一能够调用的函数就是printf。
只使用一条语句,如果你真的不能用一条语句,每增加一条语句扣1分。
不准使用如下的关键字:typedef, enum, do, while, for, switch, case, break, continue, goto,
until, if, ..具体很多我也忘了,反正能用的不多。
不能使用逗号表达式和?:表达式。
标准:(总分10分)
1. 每多一条语句扣1分,即每多一个;就扣1分
2. 每使用一次if或?:扣2分
3. 每使用一次for,while, swith各扣4分
大体上就是如上的要求了。
--------------------
flw的答案:
int p( int i, int n ){
return ( printf( "%d\n", i ) && n > 1 && p( i 1, n-1 ) && printf( "%d\n", i ) ) 1;
}
真是强, 我是想不出来了.
我考虑了用递归, 但不知道怎么控制让递归结束! 功力还是不足啊!
自己也分析分析, 学习学习!
[gan@gan src]$ cat test.c
#include
int p(int i, int n)
{
int t;
t = (printf("p1>%d\n", i) && n > 1 && p(i 1, n-1) && printf("p2>%d\n", i)) 1;
printf("return.%d i.%d n.%d \n", t, i, n);
return (t);
}
int main(int argc, char **argv)
{
p(1, 7);
return (0);
}
[gan@gan src]$ gcc -wall test.c
[gan@gan src]$ ./a.out
p1>1
p1>2
p1>3
p1>4
p1>5
p1>6
p1>7
return.1 i.7 n.1
p2>6
return.2 i.6 n.2
p2>5
return.2 i.5 n.3
p2>4
return.2 i.4 n.4
p2>3
return.2 i.3 n.5
p2>2
return.2 i.2 n.6
p2>1
return.2 i.1 n.7
这里面很多东西是为了让自己更好的理解添加上的.
--------------------
有几点很关键:
1>. 用&&和n>1来控制递归的结束, 我是想不到的, 特别是&&.
2>. 利用了true = 非0, false = 0.
3>. 利用了条件表达式是从左到右运行的.
其实我也知道这样的代码没有什么应用的意思, 但用来测试你的基本功还是挺好的.
这里面有几个问题, 我一直是不愿意这么使用, 就是利用条件表达式是从左到右来判断. 我个人认为是不是有些编译器或者其它的什么平台下又是从右到左判断的呢?
example:
if (p && p->a > 0)
{ ... }
这里面显然是说条件是从左到右测试的, 如果有其他的什么从右到左来测试就会core了. 所以我不愿意写这种模糊的代码.
我自己就曾经见到有人这样认为的:
a = b = c;
unix/ansi c中等价于(从左到右):
a = c;
b = c;
但在windows下 vc中是等价于(从右到左):
b = c;
a = c;
显然对于对a, b先后有影响的代码那样写会出问题的.
eg:
node->next = node = new_node;
阅读(1532) | 评论(0) | 转发(0) |