鱼C论坛

 找回密码
 立即注册
查看: 2910|回复: 10

c语言递归求解N的阶乘

[复制链接]
发表于 2012-6-21 15:53:49 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 浮生若梦lover 于 2012-6-21 19:53 编辑

所编程序为:
#include<stdio.h>

void main()
{

        int n, y;
        int fac(int n);
        printf("Please input a interger number: ");
        scanf("%d", &n);

        y = fac(n);

        printf("%d! = %d\n", n, y);
        
loop: ;
}

int fac(int n)
{
        int f;

        if(n < 0)
        {
                printf("Your input is error!\n");
                goto loop;
        }
        else if(0 == n || 1 ==n)
                f = 1;
        else
                f = fac(n-1) * n;
                return(f);
}


但运行之后,,如果输入为一个负数,,则除了输出:Your input is error!  还会输出:-2! = 一个错误的数。
该如何解决呢?

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-6-21 15:54:48 | 显示全部楼层
忘记删除程序中 的loop和goto语句了、。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 15:55:54 | 显示全部楼层
此论坛怎么编辑自己所发的贴呢,,,大神帮忙。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 16:22:29 | 显示全部楼层
在你发帖的时候  在编辑框右上角不是有个 高级模式吗 点开高级 模式 后 然后 在 编辑款的  正中间那里 有个 <> 这个形式的 你点开 然后把代码复制进去就OK了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 17:05:40 | 显示全部楼层
天哪!  LZ哪里学的在被调函数里面用goto语句返回?这个是个严重的错误,按理你输入一个负数的时候,在第一步if(n<0)里面执行完后打印出input error以后直接返回到主函数结尾,这样你的fanc函数没有正常返回,调用函数,返回的时候要平衡堆栈,而你这样直接跳过了平衡堆栈,按理运行要弹出一个堆栈不平衡的大警告框。。。。若LZ不懂底层,就算了,只说你问题所在,你可以把goto loop,语句改成return 0;因为一个正数的阶乘不可能为0,然后把你的printf("input error")语句移动到主函数里面,在主函数里面用If 做个判断,看这个函数if(0 ==fac(n)){printf("input error");}else {printf("%d! = %d\n", n, y);}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 17:44:18 | 显示全部楼层
  1. #include<stdio.h>

  2. void main()
  3. {

  4.         int n, y;
  5.         int fac(int n);
  6.         printf("Please input a interger number: ");
  7.         scanf("%d", &n);

  8.         y = fac(n);

  9.         printf("%d! = %d\n", n, y);
  10. }

  11. int fac(int n)
  12. {
  13.         int f;

  14.         if(n < 0)
  15.         {
  16.                 printf("Your input is error!\n");
  17.                return -1;        }
  18.         else if(0 == n || 1 ==n)
  19.                 f = 1;
  20.         else
  21.                 f = fac(n-1) * n;
  22.                 return(f);
  23. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 19:51:21 | 显示全部楼层

非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 19:52:01 | 显示全部楼层

谢谢,学习了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-21 20:01:14 | 显示全部楼层

这样的话显示为Your input is error!下面还有一行负数的阶乘等于-1,,能不能若输入为负数,,只显示Your input is error!?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-21 23:03:48 | 显示全部楼层
  1. #include<stdio.h>

  2. void main()
  3. {

  4.         int n, y;
  5.         int fac(int n);
  6.         printf("Please input a interger number: ");
  7.         scanf("%d", &n);

  8.         y = fac(n);
  9.         if(y>=0)
  10.         {
  11.                 printf("%d! = %d\n", n, y);
  12.         }
  13. }

  14. int fac(int n)
  15. {
  16.         int f;

  17.         if(n < 0)
  18.         {
  19.                 printf("Your input is error!\n");
  20.                return -1;        }
  21.         else if(0 == n || 1 ==n)
  22.                 f = 1;
  23.         else
  24.                 f = fac(n-1) * n;
  25.                 return(f);
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-22 09:31:32 | 显示全部楼层
本帖最后由 yuprxk 于 2012-6-22 10:35 编辑

#include<stdio.h>
int recursion (int n);
void main()
{

        int n, y;
        int fac(int n);
        printf("Please input a interger number: ");
        scanf("%d", &n);
                if (n < 0)
                {
                        printf ("Your input is error!\n");
                }
                else        /*n >= 0 的情况*/
                {
                        y = fac(n);
                        //y = recursion (n);
                        //输出结果
                        printf("%d! = %d\n", n, y);
                }
               
        
}
/*
**在求递归的函数中,不对值的有效性进行检查
**检查放在函数调用时
*/
int fac(int n)
{
        int f;
                /*
        if(n < 0)
        {
                printf("Your input is error!\n");
                goto loop ;
        }
        else */if(0 == n || 1 ==n)
                f = 1;
        else
                f = fac(n-1) * n;
                return(f);
}
/**/
int recursion (int n)
{
        if ( n <= 0)
        {
                return 1;
        }
        else
        {
                return        n * recursion ( n - 1 );
        }
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表