问一个小问题,多谢大家

jianzhibeihang 2009-12-09 10:18:45
之前在本版看到的一道题目,描述如下:

这是一道面试题,要求写一个函数写一个函数 int p(int i, int N);

能够输出i到N再到i,即以参数1,7调用函数,输出结果为

1 2 3 4 5 6 7 6 5 4 3 2 1

要求只用一个语句完成,不允许用?:等n多操作符和关键字,也不能用for,while,do...while,逗号操作符等等。只能用一个printf库函数。

已经有大牛将源代码给出来了,但是对于代码我还是没怎么想明白,所以发帖问问:
很想知道它的执行过程是怎么样的,为什么到7后又能从6开始输了,谢谢大家!

int p(int i, int N)
{
return printf("%d\n", i) && (N>i) && (p(i+1,N) || p(i, i));
}

...全文
185 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxfeng112 2009-12-09
  • 打赏
  • 举报
回复
当然我不是在说,LZ所说的那位大牛。

因为别人题目要求的,必须只用一条语句完成。
zhangxfeng112 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bladesoft 的回复:]
这种写法有什么好处,请高手指点
还是就只是一个写法的巧妙?
[/Quote]
我觉得是卖弄。故意写些别人很难看懂的代码出来。
利用条件判断语句的优化。如果&&左边的条件为假,那么&&右面的条件或者语句就不会再进行判断或执行。
所以:
if(condition1&&sement2),相当于:
if(condition)
sement2;
而||操作符两边的都要执行.
就这样。
bladesoft 2009-12-09
  • 打赏
  • 举报
回复
这种写法有什么好处,请高手指点
还是就只是一个写法的巧妙?
DayDayUpCQ 2009-12-09
  • 打赏
  • 举报
回复
厉害。。。。。。。。。。。。。。。。
versaariel 2009-12-09
  • 打赏
  • 举报
回复
递归掌握的不好,来学习
Dinelgua 2009-12-09
  • 打赏
  • 举报
回复
看看咱写的

int p(int i, int N)
{
return N>=i && printf("%d", i,p(i+1,N),printf("%d",i));
}
selooloo 2009-12-09
  • 打赏
  • 举报
回复
好久没看到这么牛B的代码了
printf("%d\n", i) && (N>i) && (p(i+1,N) || p(i, i));
整个语句是个逻辑表达式,&&与运算从左到右,其中一个为false,整个表达式就是false;所以函数的返回值只能是0或1;
从printf("%d\n", i)开始分析,这里因为有\n,所以printf的返回值>1,所以printf("%d\n", i)永远为true;
然后看(N>i),这是比较关键的一个判断,如果N<=i,后面就不会执行了;
再看(p(i+1,N) || p(i, i)),这个是递归的主体,而且也是逻辑表达式,首先,p(i+1,N) 和 p(i, i)无论是ture或false都会执行;它们的返回值会对下次递归产生影响,p(i+1,N) 和 p(i, i)返回值都为0的话,上次递归结束,开始层层返回,其中一个为1,递归就一直执行
Dinelgua 2009-12-09
  • 打赏
  • 举报
回复
以p(1,3)说明问题
执行顺序如下(printf返回值为打印字符个数,本处理中一直返回1为真)

第一层 打印1 为真继续向右执行,1小于3为真 继续向右执行 调用p(2,3) 等待处理或操作p(1,1)
第二层 打印2 为真继续向右执行,2小于3为真 继续向右执行 调用p(3,3) 等待处理或操作p(2,2)
第三层 打印3 为真继续向右执行,3小于3为false 右边不再执行 返回false
回到第二层 p(3,3)为false继续执行或操作右边部分 p(2,2)
P(2,2) 首先打印2 为真向右 2小于2为false返回false
回调第一层p(2,3) 返回false,执行或右边的操作p(1,1)
首先打印1 然后1不小于1 返回false
运行结束
zhangwenlang 2009-12-09
  • 打赏
  • 举报
回复
要高一些
banana1989 2009-12-09
  • 打赏
  • 举报
回复
晕真的学习了
至善者善之敌 2009-12-09
  • 打赏
  • 举报
回复
我想问一下,这样的运行效率是否比一般写法高?
Arnold9009 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jianzhibeihang 的回复:]
引用 4 楼 zhoubl668 的回复:
递归调用和 “&&”“||”操作符左右两边的执行,
自己用程序调试一下看一下过程就知道啦

就是这个 && || 操作符左右两边执行不明白
能说详细点吗? 谢谢大家了
[/Quote]

&&运算只要左边的结果为0,那么整个表达式的结果肯定为0,右边的表达式不会被计算
||运算只要左边的结果为1,那么整个表达式的结果肯定为1,右边的表达式不会被计算
jianzhibeihang 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoubl668 的回复:]
递归调用和 “&&”“||”操作符左右两边的执行,
自己用程序调试一下看一下过程就知道啦
[/Quote]
就是这个 && || 操作符左右两边执行不明白
能说详细点吗? 谢谢大家了
beck_zhou 2009-12-09
  • 打赏
  • 举报
回复
递归调用和 “&&”“||”操作符左右两边的执行,
自己用程序调试一下看一下过程就知道啦
mstlq 2009-12-09
  • 打赏
  • 举报
回复

int p(int i, int N)
{
printf("%d\n", i);
if (N>i)
{
if (p(i+1,N)==0)
return p(i,i);
else
return 1;
}
else
return 0;

}
mstlq 2009-12-09
  • 打赏
  • 举报
回复
翻译后的代码……
int p(int i, int N)
{
printf("%d\n", i);
if (N>i)
{
if (p(i+1,N)==0);
p(i,i);
return 1;
}
else
return 0;

}
jernymy 2009-12-09
  • 打赏
  • 举报
回复
递归好强大
Arnold9009 2009-12-09
  • 打赏
  • 举报
回复
递归调用
苍蝇①号 2009-12-09
  • 打赏
  • 举报
回复
递归
honghu069 2009-12-09
  • 打赏
  • 举报
回复
很经典的语句....
加载更多回复(1)

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧