鱼C论坛

 找回密码
 立即注册
查看: 1333|回复: 3

[已解决]求助一个关于递归的程序!

[复制链接]
发表于 2021-2-20 17:45:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
long fun(int n);

int main()
{
    int n;
    printf("Please input an interger number:");
    scanf("%d",&n);
    printf("%d! = %ld",n,fun(n));

}

long fun(int n)
{
    int f;
    if (n < 0)
    {
        printf("Errow\n");
    }
    else if (n == 1 || n == 0)
    {
        f = 1;
    }
    else
    {
        f = n * fun(n-1);
    }
    return f;

}

最后这里 f = n * fun(n-1); 是怎么样的一个运算逻辑呢,没想明白。我是假如n = 3,那么n是会一直在if语句里面判断吗,为什么又不减小到负数;
我这个程序是抄书上打的,我输入负数,求阶乘竟然也能得到阶乘等于0而不是输出error。这里也有疑惑。
最佳答案
2021-2-20 17:53:42
学编程的盆子 发表于 2021-2-20 17:52
为啥不会减到负数,大佬能解释下吗。还是说这能这样记住,他就是这样的规则

它一只调用
  else
    {
        f = n * fun(n-1);
    }
的前提是满足else(也就是n>1)

当n<=1时,进入另外两个分支,不会执行f = n * fun(n-1);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-20 17:48:51 | 显示全部楼层
本帖最后由 昨非 于 2021-2-20 17:52 编辑

减到n=1的时候:
  1. else if (n == 1 || n == 0)
  2.     {
  3.         f = 1;
  4.     }
复制代码

就直接返回了,不会减到负数的

  1.     if (n < 0)
  2.     {
  3.         printf("Errow\n");
  4.     }
复制代码
只适用于初次输入为负数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-20 17:52:01 | 显示全部楼层
昨非 发表于 2021-2-20 17:48
减到n=1的时候:

就直接返回了,不会减到负数的

为啥不会减到负数,大佬能解释下吗。还是说这能这样记住,他就是这样的规则
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 17:53:42 | 显示全部楼层    本楼为最佳答案   
学编程的盆子 发表于 2021-2-20 17:52
为啥不会减到负数,大佬能解释下吗。还是说这能这样记住,他就是这样的规则

它一只调用
  else
    {
        f = n * fun(n-1);
    }
的前提是满足else(也就是n>1)

当n<=1时,进入另外两个分支,不会执行f = n * fun(n-1);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 01:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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