零因子递归返回1

时间:2011-10-27 15:16:07

标签: java recursion factorial

如何在不测试基本情况的情况下,在调用1时返回0!这个递归方法,即没有为0和1执行if-else

public static long f( number ){
        if ( number <= 1 ){ // test for base case
                return 1; // base cases: 0! = 1 and 1! = 1
            } 
        else{ return number * f( number - 1 ); }
   }

我不想检查基本情况。这可能吗?

7 个答案:

答案 0 :(得分:2)

每个递归函数都需要一个必须明确检查的终止条件。如果没有,它将永远运行。所以不,不可能省略基本案例检查

答案 1 :(得分:2)

  

我不想检查基本情况。这可能吗?

不,这是不可能的。您必须测试基本情况,否则算法将不会终止。

答案 2 :(得分:2)

您只需要检查0的情况(以及完整性,小于0)虽然您需要 a 基本情况,否则您将需要只是在无限循环中运行(或直到你遇到堆栈溢出)。您可以缩短代码:

public static long f(int n){
    if (n<0) throw new InvalidParameterException();
    return n == 0 ? 1 : n * f(n-1);
}

答案 3 :(得分:2)

好吧,你调用它的基本情况是停止递归的条件......你怎么想在没有测试的情况下停止递归?

另一方面,迭代版本应该更快。

答案 4 :(得分:1)

您总是需要对递归进行基本情况检查以使其有限。 BTW,0的基本情况是因子定义。

答案 5 :(得分:0)

使用if-else或? :是最佳解决方案。即任何事情都可能更糟。

public static long f(int n){
  try {
    return 0 / n + n * f(n-1);
  } catch(ArithmeticException ae) {
    return 1;
  }
}

答案 6 :(得分:0)

正如其他人所说,你需要一个基础案例,但你不必检查它。以下导致非常糟糕的代码,所以不要在家里尝试这个。这只是一个概念证明。

定义函数的数组(索引0到21)。每个函数都使用参数n。索引0处的函数对于任何n返回1,所有其他函数返回n次索引n-1处函数的返回值。首先在索引n调用函数。不,否则,不检查任何东西。

数组大小为21就足够了,因为在21!,给定的返回类型long(64位)溢出,结果仍未定义。如果要避免OutOfBound异常,可以添加一个使用min (n, 21)调用该函数的包装器。