| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1657 人关注过本帖, 1 人收藏
标题:这段代码怎么看?定义的函数什么意思?怎么两个if?
只看楼主 加入收藏
fcpk
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-9-14
收藏
得分:0 
[bo][un]zhxh8609621[/un] 在 2008-10-9 15:05 的发言:[/bo]

那当m>1的时候执行第一个if与拒吗?还是直接跳过执行第二个if语句?



当m>1时,当然先执行第一个if语句了。。直到m==0了才退出递归
2008-10-09 16:38
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
[bo][un]shizhijia[/un] 在 2008-10-9 16:34 的发言:[/bo]

当m>1的时候执行第二个if语句

太误人子弟了啊!!!!
2008-10-09 16:41
呆呆的出行者
Rank: 1
等 级:新手上路
帖 子:125
专家分:0
注 册:2007-9-17
收藏
得分:0 
类似case输出选择吧

Made in China!
2008-10-09 21:52
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
加个main()测试一下,就知道了:
程序代码:
#include <stdio.h>
void digit(long n,long m)
{
    if(m>0)
        printf("%2ld",n%10);
    if(m>1)
        digit(n/10,m/10);
    printf("%2ld",n%10);
}

int main(void)
{
    digit(22,33);
    getch();
}

输出为:2 2 0 2 2。

``````````````````````

    下面试着来分析一下,如果是我的这个数值,也就 2  次递归:
---------------------------------------------------------------

1:void digit(long n,long m)   /* 此时,n=22,m=33 */
{
    if(m>0)   /* 此时,m=33,当然满足条件,所以输出22%10,也就是2 */
        printf("%2ld",n%10);
    if(m>1) /* m=33,也满足条件,递归,数值发生了变化,n/10,m/10,因其是长整型,所以传递的数值为 2,3 */
        digit(n/10,m/10);
    printf("%2ld",n%10); /* 递归时,还没运行到这个语句,所以这个输出没应用 */
}
----------------------------------------------------------------------

2,
void digit(long n,long m) /* 此时,n=2,m=3 */
{
    if(m>0)  /* 此时,m=3,当然满足条件,所以输出2%10,也就是2 */
        printf("%2ld",n%10);
    if(m>1) /* m=3,也满足条件,递归,数值发生了变化,n/10,m/10,因其是长整型,所以传递的数值为 0,0*/
        digit(n/10,m/10);
    printf("%2ld",n%10);/* 递归时,还没运行到这个语句,所以这个输出没应用 */
}
-------------------------------------------------------------------------------------

3,
void digit(long n,long m) /* 此时,n=0,m=0 */
{
    if(m>0)  /* 此时,m=0,不满足条件,不执行这条语句 */
        printf("%2ld",n%10);
    if(m>1) /* m=0,不满足条件*/
        digit(n/10,m/10);
    printf("%2ld",n%10);/* 下面应用到这条语句了,输出 0%10,也就是输出 0 */
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    好了,现在输出 2 2 0 三个数了,由于采用的是递归方式,每次递归都向栈内压入一个数值,现在栈内有2,2两个数,通过最后一个printf出栈,所以最后屏幕上显示的是 2 2 0 2 2。如果把最后一条语句删除,就会在屏幕上输出 2 2两个数。

###############################################

    由于C语言学得还欠火候,所以如果有解释不对的地方,还请大家批评指正。谢谢。
2008-10-10 00:02
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
广陵:第二个参数的具体值是不重要的。重要的是它的数量级。
其余的,解释得很好,不错~~~
不过,LZ的函数,第二个参数的最高位却是会对结果产生影响,如果不想要这个影响,可以看下面:
程序代码:
#include <stdio.h>
void digit(long n, long m)
{
    if (m > 0)
    {
        printf("%2ld", n % 10);
        digit(n / 10, m / 10);
    }
    printf("%2ld", n % 10);
}

int main(void)
{
    digit(12345, 200);
    return 0;
}


上面的函数:以奇数回文的方式输出n的低log10(m)+1位。
LZ的函数:若m最高位为1,以偶数回文方式输出n的低log10(m)位,否则,以奇数回文的方式输出n的低log10(m)+1位。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-10 00:24
zhxh8609621
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-10-7
收藏
得分:0 
谢谢 ~!
2008-10-14 10:47
GaFu
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2008-9-4
收藏
得分:0 
上机试一下,就知道了,肯定是两个if都执行,如果m>1
2008-10-14 12:52
快速回复:这段代码怎么看?定义的函数什么意思?怎么两个if?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018363 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved