Java 零阶乘递归返回1

Java 零阶乘递归返回1,java,recursion,factorial,Java,Recursion,Factorial,如何使此递归方法在调用0时返回1!没有测试基本情况,也就是说没有对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 )

如何使此递归方法在调用0时返回1!没有测试基本情况,也就是说没有对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 ); }
   }

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

每个递归函数都需要明确检查终止条件。如果没有,它将永远运行。所以不,不可能忽略基本情况检查

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


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

您只需要检查0的情况以及完整性,小于0,尽管您需要基本情况,否则您将在无限循环中运行,或者直到遇到堆栈溢出。不过,您可以缩短代码:

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

你所说的基本情况是停止递归的条件。。。您希望如何在没有测试的情况下停止递归

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

使用if-else或?:这是最好的解决办法。也就是说,任何可能更糟的事情

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

您总是需要对递归进行基本情况检查,以使其有限。顺便说一句,0的基本情况在阶乘定义中

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

定义函数的数组索引0到21。每个函数取一个参数n。索引0处的函数对任何n返回1,所有其他函数返回n倍于索引n-1处的函数返回值。首先调用索引n处的函数。没有,如果没有,没有任何检查


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

您总是需要一个基本情况。那么问题是什么呢?无论如何,您应该避免阶乘的递归实现,因为与循环开销相比,堆栈开销非常昂贵。如果您使用纯函数式语言,您仍然需要将基本情况定义为f0=1。如果您的意思是no if else语句,那么您可以使用一个条件表达式:return number@Alex-很可能性能与OP所做的事情无关。@Alex-我想指出,性能较差的实现不是一定是劣等的。美是无关紧要的。重要的问题是代码是否可维护以及它是否按要求工作。性能只应是主要关注点,例如,如果是真正的需求,则以可读性为代价。诚然,我们在争论——性能和可读性都不是factoriallong真正关心的问题。但在非常重要的情况下,这很重要。值得注意的是,OP仍然在执行基本检查,它只是通过执行0/n进行检查,并在n=0时捕获异常。我这么说主要是因为我担心这会得到公认的答案。彼得,无意冒犯。@Mob:酷。我认为这项禁令完全是基于基本检查,而不仅仅是针对他们使用if/else。这个答案只对那些认为自己很聪明的面试官有用;