递归阶乘返回语句

时间:2019-05-21 08:27:58

标签: c

为什么我们使用return 1终止递归函数?可以将其他任何值都用作默认值,例如1。

如果我们返回1作为函数的返回值,那么为什么1不返回主函数。

 #include<stdio.h>
 int fact(int n)
 {
   if(n>=1)
      return (n*fact(n-1));
   else
      return 1;
 }
 int main()
 {
   int a,ans;
   scanf("%d",&a);
   ans=fact(a);
   printf("factorial of %d is %d ",a,ans);
   return 0;
  }
  /*
   explanation
          fact(4);
          if(4>=1) 4*fact(3)
          if(3>=1) 4*3*fact(2)
          if(2>=1) 4*3*2*fact(1)
          if(1>=1) 4*3*2*1*fact(0)
          if(0>=1) return 1;

  */

4 个答案:

答案 0 :(得分:2)

  

为什么我们使用“ return 1”终止递归函数

因为这应该涵盖n不是>=1的情况,换句话说n0的情况。我认为否定n是无效的。 0!1,因此为什么它返回该值。

  

如果我们返回1作为函数的结尾,那么为什么不返回1   主要功能。

如果用0的{​​{1}}或1调用了该函数,则n返回到主函数。对于任何其他值,1仅在递归阶乘调用中返回,并且返回到1函数的值不是main,而是1,后者是在这种情况下就不会(n*fact(n-1))

答案 1 :(得分:2)

int fact(int n)
{
    if (n >= 1)
        return n * fact(n-1);
    else
        return 1;
}

每次调用fact()函数时,它都会运行return n * fact(n-1);语句或return 1;语句,但不会同时运行两者。

您在fact(4)中呼叫main()。它是这样运行的:

main:
  compute fact(4)
  fact(4):
  |  4 >= 1?  Yes!
  |  compute 4 * fact(3)
  |    fact(3):
  |    |  3 >= 1?  Yes!
  |    |  compute 3 * fact(2)
  |    |    fact(2):
  |    |    |  2 >= 1? Yes!
  |    |    |  compute 2 * fact(1)
  |    |    |    fact(1):
  |    |    |    |  1 >= 1? Yes!
  |    |    |    |  compute 1 * fact(0)
  |    |    |    |    fact(0):
  |    |    |    |    |  0 >= 1? NO!
  |    |    |    |    |  return 1;
  |    |    |    |    +--> 1
  |    |    |    |  fact(0) is 1, return 1 * 1 (--> 1)
  |    |    |    +--> 1
  |    |    |  fact(1) is 1, return 2 * 1 (--> 2)
  |    |    +--> 2
  |    |  fact(2) is 2, return 3 * 2 (--> 6)
  |    +--> 6
  |  fact(5) is 6, return 4 * 6 (--> 24)
  +--> 24
  fact(4) is 24, assign it to `ans`, print it etc
// end of main

当函数使用return语句时(或者如果未达到return则执行最后一条语句后,控件将传递回调用它的表达式。

答案 2 :(得分:1)

docker-compose.yaml时执行return语句。

n==0的阶乘为1,因此我们返回1。

答案 3 :(得分:0)

   /*
      explanation
          fact(4);
          if(4>=1) 4*fact(3)
          if(3>=1) 4*3*fact(2)
          if(2>=1) 4*3*2*fact(1)
          if(1>=1) 4*3*2*1*fact(0)
          if(0>=1) return 1; now return is default tend to multiply as we give 1 and 
           return has already 24 in its stack so 1*24 is returned to main()
          if we give return 2; 2*24 is returned to main();

    */

我们不希望最终结果受到影响,要解决该错误,任何乘以1的结果都将相同,因此我们在递归函数中使用1作为返回值。

实际上,return也是一个堆栈寄存器,在函数中使用with调用时,该寄存器保存临时变量,并且它通过乘法属性操作默认值,因为我们始终只能发送一个返回值。