以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  荤菜求助:求n!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=45169)


--  作者:荤菜
--  发布时间:4/10/2007 5:43:00 PM

--  荤菜求助:求n!
求n!
long ff(int n)
{
    long f;
    if(n<0) printf("n<0,input error");
    else if(n==0||n==1) f=1;
    else f=ff(n-1)*n;
    return(f);
}
main()
{
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=ff(n);
    printf("%d!=%ld",n,y);
getch();}
}
/*输入4结果正确*/
改成程序2
long ff(int n)
{
    long f;
    if(n>1)

     f=ff(n-1)*n;
    return(f);
}
main()
{
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=ff(n);
    printf("%d!=%ld",n,y);
getch();}
/*4!居然是0*/
再改成程序3
long ff(int n)
{

    if(n>1)

     n=ff(n-1)*n;
    return(n);
}
main()
{
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=ff(n);
    printf("%d!=%ld",n,y);
getch();}
/*结果又正确*/
程序2我假设输入的数都大于1,现在输入4,结果却等于0,程序3和程序2相比改了两处,1。把long f;去掉,2。把f改成n,结果结果却奇迹般的正确了,为什么程序1和程序3对了,而程序2错了呢?


--  作者:girlstop
--  发布时间:4/10/2007 9:12:00 PM

--  
程序2有个问题。n=2时,f=ff(1)*2。
但是ff(1)的时候,if语句不执行,直接返回f,f缺省为0.所以ff(1)=0

程序3之所以正确是因为求ff(1)的时候,虽然if语句不能执行,但是return(n)返回1.所以ff(1)=1


--  作者:一分之千
--  发布时间:4/11/2007 9:10:00 AM

--  
对于求阶乘的算法来说,只有程序1是正确的,程序2 和三都是不对的,首先程序2、3都都没有考虑当数字等于0 1 的时候。
而当输入数值等于4的时候之所以出现你说的那种情况,是应为在程序2中你使用了一个未初始化的变量来作为返回值,这个函数使用了一个递归,下一步的返回值是用来作为当前步的乘数来进行计算的。当n=1的时候,f不参与计算,而又未进行初始化,这时候f默认值是一个随机的无限大的值。导致了计算结果的错误。而当你使用程序三的时候,它返回的是n的值,这恰好等于1的阶乘,结算结果就正确了。
--  作者:荤菜
--  发布时间:4/12/2007 1:57:00 PM

--  
谢谢各位,我明白了。
--  作者:lixiaoting
--  发布时间:7/29/2007 3:34:00 PM

--  
#include<stdio.h>
#include<conio.h>
long ff(int n)
{
    long f;
    if(n==1||n==0)f=1;
    if(n>1)f=ff(n-1)*n;
    return(f);
}
main()
{
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=ff(n);
    printf("%d!=%ld",n,y);
getch();}
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
125.000ms