原帖由 flw 于 2007-4-2 14:57 发表
很明显就是想让递归嘛。不过原型给得不清楚,没有描述参数语义。下面我假设 N 是指数字的个数而不是截止数。
[code]int p( int i, int N ){
return ( N && printf( "%d\n", i ) &&am ...
原帖由 weckay 于 2007-4-2 15:39 发表
我想起来了,N应该是上限。我记得原题中有一句话是这样的up to N and then down to i.
原帖由 flw 于 2007-4-2 15:42 发表
稍微简化了一下:
复制代码
- int p( int i, int N ){
- return ( printf( "%d\n", i ) && N > 1 && p( i+1, N-1 ) && printf( "%d\n", i ) ) + 1;
- }
...
原帖由 Edengundam 于 2007-4-2 15:51 发表
恩.....我只能这样了..
复制代码
- return (N >= i) && printf("%d\n", i) && (N > i) && p(i + 1, N) && printf("%d\n", i);
原帖由 InfoHunter 于 2007-4-2 21:47 发表
错了,应该是这样:
复制代码
- return (N >= i) && printf("%d\n", i) && (N > i) && p(i + 1, N) & printf("%d\n", i);
最后一个prin ...
原帖由 InfoHunter 于 2007-4-2 21:47 发表
错了,应该是这样:
复制代码
- return (N >= i) && printf("%d\n", i) && (N > i) && p(i + 1, N) & printf("%d\n", i);
最后一个prin ...
原帖由 lee2008 于 2007-4-3 08:28 发表
怎么就是没看懂,后半部分的6 5 4 3 2 1 是怎么生成的啊?
原帖由 InfoHunter 于 2007-4-3 09:15 发表
典型的递归,还是用p(1,7)来说
当i= 6时,调用p(7,7),递归进入p,这时(N > i)为假,返回假,回到p(6,7),这时i = 6,然后执行最后的printf("%d\n", i),打印出6,类推得到5.....1
流程:
p( ...
原帖由 lsmup 于 2007-4-3 10:00 发表
注意两点:
1最关键的还是递归的特点:压栈的操作
2&&运算符的计算特性:必须是前面的为TRUE,才计算后面的。如果为假,则后面的语句则后面的语句不执行
例子p(1,7);就这一步递归来说,打印的是第一个 ...
原帖由 flw 于 2007-4-2 14:57 发表
很明显就是想让递归嘛。不过原型给得不清楚,没有描述参数语义。下面我假设 N 是指数字的个数而不是截止数。
原帖由 lee2008 于 2007-4-3 09:45 发表
我就是这里没搞明白, 怎么回到p(6,7)的? i是如何自减的啊?
原帖由 飞灰橙 于 2007-4-3 11:05 发表
其实大家都没做对,包括我上面那个只写一次printf地实现。
题目中有这句,
函数中唯一能够调用的函数就是printf
不能递归调用本身!!!可能EMC的家伙自己也做不出来:)
原帖由 flw 于 2007-4-3 11:11 发表
如果不递归的话,能不能做出来呢?
我觉得还是有可能的。
只需要用 flwlibc 不要用 glibc 就可以。
printf( "%*z", i, N );
原帖由 flw 于 2007-4-3 11:11 发表
如果不递归的话,能不能做出来呢?
我觉得还是有可能的。
只需要用 flwlibc 不要用 glibc 就可以。
printf( "%*z", i, N );
原帖由 Edengundam 于 2007-4-3 11:11 发表
就是这样的:em11:
原帖由 Edengundam 于 2007-4-3 11:11 发表
就是这样的:em11:
不是flwlibc....
是emc-libc.....
原帖由 flw 于 2007-4-3 11:13 发表
我做出了这道题之后,EMC 录用我了,然后购买了我的 flwlibc,就可以依照协定改名为 emc-libc 了。
原帖由 flw 于 2007-4-3 11:42 发表
楼上的,你的签名该改了。
原帖由 flw 于 2007-4-3 11:12 发表
我觉得还是 v 字母比较形象一些。
原帖由 飞灰橙 于 2007-4-3 13:27 发表
一条语句,只调用printf, 不调用其他函数,包括函数p自身的。
(近在32位pc, gcc或vc试验过,不保证任何环境有效)
[code]
int p (int i, int N)
{
return i < 2*N
&& printf ("%d\n&qu ...
原帖由 InfoHunter 于 2007-4-3 09:15 发表
典型的递归,还是用p(1,7)来说
当i= 6时,调用p(7,7),递归进入p,这时(N > i)为假,返回假,回到p(6,7),这时i = 6,然后执行最后的printf("%d\n", i),打印出6,类推得到5.....1
流程:
p( ...
原帖由 飞灰橙 于 2007-4-3 13:27 发表
一条语句,只调用printf, 不调用其他函数,包括函数p自身的。
(近在32位pc, gcc或vc试验过,不保证任何环境有效)
[code]
int p (int i, int N)
{
return i < 2*N
&& printf ("%d\n&qu ...
原帖由 Edengundam 于 2007-4-3 13:39 发表
看不明白
不过1-7没有问题. 但是其他的不太行
原帖由 飞灰橙 于 2007-4-3 13:42 发表
1-N都可以,但第一个不是1,最后还是会退到1,这个不大好办
原帖由 飞灰橙 于 2007-4-3 13:27 发表
一条语句,只调用printf, 不调用其他函数,包括函数p自身的。
(近在32位pc, gcc或vc试验过,不保证任何环境有效)
[code]
int p (int i, int N)
{
return i < 2*N
&& printf ("%d\n&qu ...
原帖由 slay78 于 2007-4-3 14:19 发表
是修改函数返回地址到调用之前,并且把压入的参数改了么?
原帖由 飞灰橙 于 2007-4-3 14:27 发表
是的。
原帖由 slay78 于 2007-4-3 14:30 发表
看可不可以用N的高位把i存起来,解决后面回到1的问题,不过那样实际支持只有16位了
原帖由 thinkinnight 于 2007-4-3 21:23 发表
哦,搞懂了,其实只要非0就可以了,不过这些可真是高级技巧啊,不知道哪里能够学习到?
原帖由 飞灰橙 于 2007-4-3 13:27 发表
一条语句,只调用printf, 不调用其他函数,包括函数p自身的。
(近在32位pc, gcc或vc试验过,不保证任何环境有效)
[code]
int p (int i, int N)
{
return i < 2*N
&& printf ("%d\n&qu ...
原帖由 nully 于 2007-4-4 14:14 发表
我的是最清析的:
int p(int a, int b) {
a < b ? printf("%d\n", a),p(a + 1, b),printf("%d\n",a):printf("%d\n",b);
}
原帖由 openq 于 2007-4-4 17:52 发表
zhe jiu shi xian zai ruan jian hang ye de yi ge wu qu,hao xiang zhi you dai ma xie de yue qiao miao jiu yue li hai,ke shi ta you mei you xiang guo zhe yang de dai ma hui gei hou qi de ruan jian wei hu dai lai duo da de kun nan?shi xiang yi xia,zhe yang de dai ma mei ge ren dou xie de chu lai ma? ru guo zai ji qian hang dai ma zhong you zhe me jihang ru ci de dai ma,bu shi bian xie zhe ge dai ma de ren you duo shao ren yi yan neng kan chu lai? ru guo xie zhe dai ma de ren li kai gong si le,ni shi wei hu ren yuan ni hui pei fu zhe ge cheng xu yuan hai shi tong hen zhe ge cheng xu yuan?
原帖由 openq 于 2007-4-4 17:52 发表
zhe jiu shi xian zai ruan jian hang ye de yi ge wu qu,hao xiang zhi you dai ma xie de yue qiao miao jiu yue li hai,ke shi ta you mei you xiang guo zhe yang de dai ma hui gei hou qi de ruan jian wei ...
原帖由 Edengundam 于 2007-4-4 18:51 发表
不能用"难以维护"来为自己对语言的不熟悉找借口. 这题作为最后一题的确值得商榷.
这题从某种意义上考察了思维方式, 相信, 凡是想到递归的人, 都已经算成功一半了^_^
相比, 我觉得很多代码, tr ...
原帖由 openq 于 2007-4-4 23:56 发表
请问这位大侠,如果让你写一个的到这样结果到程序,你的首选是一半的循环,还递归。
循环实现和递归实现的效率根本就是天壤之别,程序用来完成我们给的任务的,我想这循环和递归之间的效率学过语言的人都应该很 ...
原帖由 openq 于 2007-4-4 23:56 发表
请问这位大侠,如果让你写一个的到这样结果到程序,你的首选是一半的循环,还递归。
循环实现和递归实现的效率根本就是天壤之别,程序用来完成我们给的任务的,我想这循环和递归之间的效率学过语言的人都应该很 ...
原帖由 飞灰橙 于 2007-4-5 00:17 发表
那你就用循环把上面的过程实现一个看看,
到底是递归更清晰呢,还是循环更清晰.
你的上上一贴说的是清晰,上一贴说的是效率.
原帖由 Edengundam 于 2007-4-5 00:21 发表
高手还在啊...睡觉了...晚安
原帖由 flw 于 2007-4-2 15:43 发表
如果是这样的话,那这个函数的原型就给得非常恶心。
如果是我,我会给出复制代码
- int p( int min, int max );
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |