如何在不测试基本情况的情况下,在调用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 ); }
}
我不想检查基本情况。这可能吗?
答案 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)
调用该函数的包装器。