【问题标题】:Factorial program using recurrsion returning wrong value使用递归返回错误值的阶乘程序
【发布时间】:2016-12-10 02:43:06
【问题描述】:

我正在尝试使用递归计算阶乘,但我的程序返回错误值。我无法理解递归功能。请帮助我理解递归是如何工作的。我的代码如下:

#include <stdio.h>
#include <math.h>

int main() 
{
    //code
    int T,N,sol;
    scanf("%d\n",&T);

    while(T--) {
        scanf("%d\n",&N);

        sol=fact(N);
        printf("%d\n",sol);
    }

    return 0;
}

int fact(int n)
{
    int value;
    while(n>0) {
        value=n*fact(n-1);
        n=n-1;
    }

    return value;
}

【问题讨论】:

  • 因为你的功能设置错误
  • 在使用之前初始化value。加上功能也错了。
  • n == 0时返回的值是多少?
  • 当使用递归时,设置一个终止情况,或递归结束的基本情况。然后使用不同的参数值设置递归继续的一般情况。
  • 循环也很奇怪。迭代或递归,但不要两者都做。

标签: c recursion factorial


【解决方案1】:

您在函数fact 中使用递归和while 循环

递归应该替换循环。您还需要该函数的退出条件。对于阶乘,它可以是00 的阶乘是1

函数可以改写如下

int fact(int n)
{
  int value;
  if (n <0)
  {
     return -1;
  }
  else if (n == 0)
  { 
    return 1;
  }
  else
  {
    value=n*fact(n-1);
  }
  return value;
}

编辑为负数添加条件。如果函数返回-1,那么主程序应该给用户一个错误信息。

【讨论】:

  • 如果你传递一个负值,递归将永远不会结束。
  • 未定义负数的阶乘。如果我们期望一个负数,那么应该给出一些其他类型的错误,最好是在输入阶段,该函数也可以返回 -1 来表示错误。
  • 那么就为此设置一个案例
【解决方案2】:

用这个替换你的事实函数:

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

【讨论】:

  • 这是一个正确的答案,但请说明理由,不要只贴代码
猜你喜欢
  • 2019-10-07
  • 2019-10-22
  • 2018-10-16
  • 1970-01-01
  • 2023-03-30
  • 2011-01-20
  • 2021-12-06
  • 1970-01-01
  • 2019-05-26
相关资源
最近更新 更多