递归函数 - 保持返回0?

时间:2012-01-31 20:17:26

标签: java recursion return

我试图写一个递归函数,它返回一个数字的阶乘。如果数字为0或负数,则应返回0。 然而,每当我测试它时,它总是返回0,有人可以对此有所了解吗?

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

    else

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

} 

7 个答案:

答案 0 :(得分:4)

您总是会在基本情况下将结果乘以零。 0的因子为1,而不是0

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

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

不是最短的实现,但非常易读。

答案 1 :(得分:4)

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

return integer * (factorial(0))

将解析为

return integer * 0

是0

答案 2 :(得分:3)

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

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

您正在乘以数字,因为您知道任何乘以0的数字为零。您需要使用的是1乘法标识,因为任何数字乘以1都是数字本身。

答案 3 :(得分:2)

尝试使用铅笔和纸张执行简单的测试用例:

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)

因此,似乎每次递归调用都会到达&#34; 0&#34;。

尝试添加此条件:

else if(integer == 1)
  return 1;

答案 4 :(得分:1)

简单地使用1而不是0.当你使用0时,任何数字都会乘以0,返回0。

示例:

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

您必须返回1,乘以0始终返回0

if( integer < 2)
{
    return 1;
}