1.以下程序是用辗转相除法来计算两个非负数之间的最大公约数:
long long gcd(longlong x,longlong y){
if(y==0)
return0;
elsereturn gcd(y,x%y);
}我们假设x,y中最大的那个数的长度为n,基本基本运算时间复杂度是O(1),那么该程序的时间复杂度为()
O(logn)
O(1)
O(n^2)
O(n)
答案: A
快速的思路是排除法,不是与固定几个值计算,所以不是O(1)的,当然也不会把每个数都遍历个遍来确定,不是O(n)和O(n^2)的,于是选择A。
2.计算斐波那契数列第n项的函数定义如下:
int fib(int n){
if(n==0)
return1;
elseif(n==1)
return2;
else
returnfib(n-1)+fib(n-2);
}若执行函数调用表达式fib(10),函数fib被调用的次数是:
117
137
157
177
答案: D
这题相当于再求一次费波那奇数列。定义g(n)函数表示计算fib(n)而调用的fib函数的次数 , 则
g(10) = g(9) + g(8) + 1(1是调用fib(10)需要执行一次fib函数)
……
g(2) = g(1) + g(0) + 1
g(1) = 1
g(0) = 1
可以求得g(10) = 177
若C(n) 表示计算次数,则
C(0) = 1;
C(1) = 1;
C(n) = C(n-1) + C(n-2) + 1; n>=2;
故:
C(0) = 1;
C(1) = 1;
C(2) = 1 + 1 + 1 = 3;
C(3) = 3 + 1 + 1 = 5;
C(4) = 5 + 3 + 1 = 9;
C(5) = 9 + 5 + 1 = 15;
……
C(0) = 1;
C(1) = 1;
C(n) = C(n-1) + C(n-2) + 1; n>=2;
故:
C(0) = 1;
C(1) = 1;
C(2) = 1 + 1 + 1 = 3;
C(3) = 3 + 1 + 1 = 5;
C(4) = 5 + 3 + 1 = 9;
C(5) = 9 + 5 + 1 = 15;
……
954

被折叠的 条评论
为什么被折叠?



