Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用大O递归代替乘法_Java_Recursion_Big O - Fatal编程技术网

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中的任何其他情况都不会得到相同的处理。很容易用累加器重写它,使其成为尾部递归。