程序时间复杂度

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;
 ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值