递归
#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;
} 你好!你的代码是一个用于计算阶乘的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语句的。 isdkz 发表于 2023-4-11 21:13
你好!你的代码是一个用于计算阶乘的C程序,它使用了递归的方法。递归是一种编程技巧,其中一个函数在执行 ...
等等大佬 result被赋值为1
返回result然后和if语句有啥关系嘛
那个if语句没有接收到num>0按理应该不会走下去才对 isdkz 发表于 2023-4-11 21:13
你好!你的代码是一个用于计算阶乘的C程序,它使用了递归的方法。递归是一种编程技巧,其中一个函数在执行 ...
哦哦哦 懂了就是返回之后 那个函数的num参数变成一了又可以继续if了 学不死就死里xue 发表于 2023-4-11 21:28
哦哦哦 懂了就是返回之后 那个函数的num参数变成一了又可以继续if了
对的 isdkz 发表于 2023-4-11 21:29
对的
大佬再问一下 那个return result返回了result ,然后result这个值是去了参数那里嘛 学不死就死里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]