学编程的盆子 发表于 2021-2-20 17:45:44

求助一个关于递归的程序!

#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:48:51

本帖最后由 昨非 于 2021-2-20 17:52 编辑

减到n=1的时候:
else if (n == 1 || n == 0)
    {
      f = 1;
    }
就直接返回了,不会减到负数的

    if (n < 0)
    {
      printf("Errow\n");
    }只适用于初次输入为负数

学编程的盆子 发表于 2021-2-20 17:52:01

昨非 发表于 2021-2-20 17:48
减到n=1的时候:

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

为啥不会减到负数,大佬能解释下吗。还是说这能这样记住,他就是这样的规则

昨非 发表于 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);
页: [1]
查看完整版本: 求助一个关于递归的程序!