Java 用大O递归代替乘法
正在研究一种替代乘法的方法Java 用大O递归代替乘法,java,recursion,big-o,Java,Recursion,Big O,正在研究一种替代乘法的方法 public static int mult(int num, int repeat){ if (repeat == 0) return 0; if (repeat == 1) return num; return num + mult(num, repeat - 1); } 就时间和空间复杂度而言,这是否是O(k)时间,其中k是repeat和O(1)space?这是O(k)时间,因为您将每次repeat调用
public static int mult(int num, int repeat){
if (repeat == 0) return 0;
if (repeat == 1) return num;
return num + mult(num, repeat - 1);
}
就时间和空间复杂度而言,这是否是O(k)时间,其中k是repeat和O(1)space?这是O(k)时间,因为您将每次
repeat
调用此函数一次,每次调用都是O(1)。然而,这也是O(k)空间a,在达到终止条件之前(在没有尾部调用递归优化的情况下),您将有k个堆栈帧。“正在研究一种方法来替换乘法”-为什么?询问问题,而不是真正替换运算符。只是在练习我的递归技巧@jonrsharpe@Snorehorse很抱歉,我该怎么做?我刚才在这里看到了很多大o问题,所以我认为它是允许的抱歉,你是对的,有一些参数认为它是允许的,因为它包含实际的代码,如:如果我错了,请纠正我,但是尾部递归不能在这里应用,因为num
必须保留到递归调用返回为止,因此,不能丢弃包含num
的堆栈帧。这里有一个与尾部递归兼容的版本:@Arkadiy一个好的优化器可能会告诉您,num
根本不会改变,所以我认为尾部递归可以应用。我不知道是否有人那么聪明。如果它是像num+mult(num-1,repeat-1)
那样的东西,它会改变事情[当然这不再是乘法]。@ajb不这么认为。只有尾部调用在应用的语言中得到优化。Prolog有一个例外,尾部cons
,因此在特定情况下,它会变成尾部递归,但Prolog中的任何其他情况都不会得到相同的处理。很容易用累加器重写它,使其成为尾部递归。