【问题标题】:Recursive function- keeps returning 0?递归函数 - 不断返回 0?
【发布时间】:2012-02-23 13:42:13
【问题描述】:

我正在尝试编写一个返回数字阶乘的递归函数。如果数字为 0 或负数,则应返回 0。 但是每次我测试它时,它总是返回 0,请问有人能解释一下吗?

int factorial( int integer)
{
    if( integer <= 0)
    {
        return 0;
    }

    else

        return integer* (factorial(integer-1));

} 

【问题讨论】:

    标签: java recursion return


    【解决方案1】:

    因为它一直用整数 - 1 调用自己,它最终会用 0 调用自己,然后你将有这样的调用:

    return integer * (factorial(0))
    

    这将解决

    return integer * 0
    

    0

    【讨论】:

    • 感谢大家的回答,但是有人告诉我,如果输入0或负数,该方法必须返回0。有没有办法实现?
    • 可以,只要再加一个“if”:如果参数为1,则返回1。
    【解决方案2】:

    在基本情况下,您将始终将结果乘以零。 0 的阶乘是 1,而不是 0

    如果输入小于1时函数必须返回0

    int factorial (int integer) {
        if (integer < 1) {
            return 0;
        } else if (integer == 1) {
            return 1;
        } else {
            return integer * factorial(integer-1);
        }
    }
    

    不是最短的实现,但可读性很强。

    【讨论】:

      【解决方案3】:

      您的函数必须在基本情况下返回 1,如下所示:

      if (integer <= 0) {
          return 1;
      }
      

      您正在乘以数字,并且您知道任何数字乘以0 都是零。您需要改用 1,即乘法恒等式,因为任何数字乘以 1 就是数字本身。

      【讨论】:

        【解决方案4】:

        尝试用铅笔和纸执行一个简单的测试用例:

        main:
          factorial(3)
            return 3 * factorial(2)
              factorial(2)
                return 2 * factorial(1)
                  factorial(1)
                    return 1 * factorial(0)
                      factorial(0)
                        return 0
                    return 1 * 0 (equals 0)
                return 2 * 0 (equals 0)
           return 3 * 0 (equals 0)
        

        因此,似乎每个递归调用都达到“0”。

        尝试添加这个条件:

        else if(integer == 1)
          return 1;
        

        【讨论】:

          【解决方案5】:

          只需使用 1 而不是 0。当您使用 0 时,您拥有的任何数字都将乘以 0,返回 0。

          例子:

          5! = 5.4.3.2.1 = 120 而不是 5.4.3.2.1.0 = 0

          【讨论】:

            【解决方案6】:

            您允许整数通过递归调用达到零,并在发现整数为零时返回零。因此,您将最后一次递归调用中的结果乘以零。因此,您总是得到零作为答案。

            【讨论】:

              【解决方案7】:

              你必须返回1,乘以0总是返回0

              if( integer < 2)
              {
                  return 1;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-07-15
                • 2017-01-12
                • 2015-10-22
                • 1970-01-01
                • 2012-09-21
                • 2016-06-30
                相关资源
                最近更新 更多