Java 大O表示法/时间复杂性问题
递归调用n次(但不发生在for循环中)并且只包含方法中的if/else语句的递归方法调用会被视为O(n)还是O(1)?谢谢 这里是python中的阶乘代码示例。递归与循环非常相似,这里我们一次又一次地调用阶乘函数,直到if条件满足,这在循环中是相同的。so O(N)Java 大O表示法/时间复杂性问题,java,recursion,time-complexity,big-o,Java,Recursion,Time Complexity,Big O,递归调用n次(但不发生在for循环中)并且只包含方法中的if/else语句的递归方法调用会被视为O(n)还是O(1)?谢谢 这里是python中的阶乘代码示例。递归与循环非常相似,这里我们一次又一次地调用阶乘函数,直到if条件满足,这在循环中是相同的。so O(N) def阶乘(n): 如果在计算时间复杂度时n,则有3种类型- 1) 最佳案例 2) 最坏情况 3) 一般情况 因为,你被写为O(n),这意味着你正在检查最坏情况下的时间复杂度,这将是O(n)As,我们将考虑递归出现的块作为最坏情况。
def阶乘(n):
如果在计算时间复杂度时n,则有3种类型-
1) 最佳案例
2) 最坏情况
3) 一般情况
因为,你被写为O(n),这意味着你正在检查最坏情况下的时间复杂度,这将是O(n)As,我们将考虑递归出现的块作为最坏情况。
如果您正在寻找最佳情况,您可以将其视为O(1),因为根据If-else条件,它可能不会进入递归。它将是O(N)
进行复杂性分析的一般方法是查找所有重要的常量时间可执行语句或表达式(如比较、算术运算、方法调用、赋值),并计算出代数公式,给出它们出现的次数。然后将该公式简化为等效的大O复杂度类
在您的情况下,方法调用非常重要
当你有一些这样做的经验时,你将能够省去那些“显然”不会导致整体复杂性的语句。但是首先,计算每件事是一个很好的练习。递归与循环几乎相同,所以O(N)如果N
加倍,递归的数量会发生什么变化?双倍:O(n),保持不变:O(1),四倍:O(n^2)。它真的很简单,“称为N次”:所以它中的任何东西都必须做N次,对吗?在O(1)中,你会怎么做?n=1和b=1000000时的工作量相同吗?例如,它是否会导致相同数量的方法调用?如果不是,你至少可以排除O(1)。你的问题我有点不清楚,但听起来可能是O(n)。
def factorial( n ):
if n <1: # base case
return 1
else:
returnNumber = n * factorial( n - 1 ) # recursive call
print(str(n) + '! = ' + str(returnNumber))
return returnNumber