我主要只是想确认我的理解。以下来自“破解编码面试”的big-o符号问题。答案键说运行时是“ O(b)或O(n)。递归代码通过b次调用进行迭代,因为它在每个级别上减去一个。”
因此,我知道函数power(a,b-1)的部分等于O(b)或O(n)。 然后“ a * power(a,b-1)”行中的第一个“ a”是常数吗?
我知道,当我们有一个像O(constant * b)之类的big-o时,就必须舍弃常数,而它变成O(b)。
int power(int a, int b){
if(b < 0)
return 0; //error
else if(b == 0)
return 1;
else
return a * power(a, b-1)
}
答案 0 :(得分:1)
您的power
函数只是计算某些输入整数a
的幂,将其提高到b
的幂。它是通过简单地将a
乘以b
倍,然后返回该值来实现的。函数调用的数量实际上与a
的值无关,而仅与b
的值有关。因此,此函数的行为类似于O(b)
。我们还可以将b
重命名为n
,并将其命名为O(n)
,这可能是您可能会看到的。
答案 1 :(得分:0)
我认为,解释这一点的最清晰方法是指出“ a”是变量。您没有多次执行计算机指令“ a”。
您还可以看到“ b”也是一个变量。但是在“ b”的情况下,它还控制递归函数被调用的次数。因此,您确实必须执行一些计算机指令“ b”次。只要该值是常数,多少条指令都无关紧要。您的程序没有其他变量会影响执行的指令数量。
因此,假设您的n = b,您的函数是O(b)或O(n)(因为这是影响程序完成时间的输入。)
请记住,这全都在于估计必须执行的指令数。