学不死就死里xue 发表于 2023-4-11 21:11:04

递归

#include<stdio.h>
long fact (int num);
long fact (int num)
{
        long result;                                             这里我的思路是首先传入5,在if语句卡着,直到减到0退出来到else。然后这里我就不会了 难道经过了else还能回到if语句的吗?????
       
        if (num>0)
        {
                result=num*fact(num-1);
        }
        else
        {
                result=1;
        }
        return result;
}
int main()
{
        int num;
        printf("请输入一个整数 ");
        scanf("%d",&num);
        printf("%d的阶乘是%d",num,fact(num));
        return 0;
}

isdkz 发表于 2023-4-11 21:13:56

你好!你的代码是一个用于计算阶乘的C程序,它使用了递归的方法。递归是一种编程技巧,其中一个函数在执行过程中调用自身。对于你的问题,是的,经过else分支后,它会返回到if语句。

让我们详细分析一下这个递归过程:

当你传入5时,fact(5)开始执行。此时,num大于0,因此程序进入if分支。在if分支中,result = num * fact(num - 1)。要计算fact(5),我们需要计算5 * fact(4)。

接下来,fact(4)开始执行。同样,它进入if分支,需要计算4 * fact(3)。这个过程会一直持续下去,直到fact(1)调用fact(0)。这时,num为0,程序进入else分支,result被赋值为1。

现在,我们可以逐步回溯到最初的调用。fact(0)返回1,因此fact(1)计算结果为1 * fact(0) = 1。接着,fact(2)计算结果为2 * fact(1) = 2。以此类推,最终我们得到fact(5) = 5 * fact(4) = 5 * 4 * fact(3) = 5 * 4 * 3 * fact(2) = 5 * 4 * 3 * 2 * fact(1) = 5 * 4 * 3 * 2 * 1 = 120。

因此,fact(5)返回120,并在main()函数中被打印出来。

这个递归过程是通过函数调用栈实现的。每次调用fact()时,它都会在栈上创建一个新的帧。当fact(0)返回时,它会将结果返回给调用它的fact(1),然后栈帧被销毁。此后,fact(1)返回结果给fact(2),并销毁其栈帧。这个过程一直持续到最初的fact(5)调用。这就是程序如何在执行完else分支后返回到if语句的。

学不死就死里xue 发表于 2023-4-11 21:26:00

isdkz 发表于 2023-4-11 21:13
你好!你的代码是一个用于计算阶乘的C程序,它使用了递归的方法。递归是一种编程技巧,其中一个函数在执行 ...

等等大佬 result被赋值为1
返回result然后和if语句有啥关系嘛
那个if语句没有接收到num>0按理应该不会走下去才对

学不死就死里xue 发表于 2023-4-11 21:28:31

isdkz 发表于 2023-4-11 21:13
你好!你的代码是一个用于计算阶乘的C程序,它使用了递归的方法。递归是一种编程技巧,其中一个函数在执行 ...

哦哦哦 懂了就是返回之后 那个函数的num参数变成一了又可以继续if了

isdkz 发表于 2023-4-11 21:29:31

学不死就死里xue 发表于 2023-4-11 21:28
哦哦哦 懂了就是返回之后 那个函数的num参数变成一了又可以继续if了

对的

学不死就死里xue 发表于 2023-4-12 04:39:22

isdkz 发表于 2023-4-11 21:29
对的

大佬再问一下 那个return result返回了result ,然后result这个值是去了参数那里嘛

isdkz 发表于 2023-4-12 08:19:52

学不死就死里xue 发表于 2023-4-12 04:39
大佬再问一下 那个return result返回了result ,然后result这个值是去了参数那里嘛

是的,return result; 会将 result 的值返回给调用 fact() 函数的地方。在这个例子中,当 fact() 函数递归调用自身时,返回的 result 值会作为计算结果的一部分。

例如,当 fact(5) 被调用时,程序进入 if 分支并执行 result = num * fact(num - 1);。这里,num 的值为 5,所以程序会计算 5 * fact(4)。然后,fact(4) 会被调用,同样进入 if 分支,计算 4 * fact(3)。

当递归调用到达 fact(0) 时,num 的值为 0,程序进入 else 分支并执行 result = 1;。然后,return result; 会将 1 返回给调用它的 fact(1)。此时,fact(1) 的 result 值计算为 1 * 1,最后返回 1。之后,fact(2) 的 result 值计算为 2 * 1(即 2 * fact(1) 的返回值),返回 2。以此类推,递归调用逐步回溯,每次返回的 result 值都作为上一级调用中的计算结果的一部分。

总之,return result; 将 result 值返回给调用它的地方(在本例中为递归调用),该值最终会成为计算阶乘结果的一部分。
页: [1]
查看完整版本: 递归