递归-算法题解1

在牛客网刷题,打算记录自己平常所做的题,以加深印象。同时记录自己假期的刷题的点滴。


选B。

递归算法是一种直接或者间接地调用自身算法的过程。在计算机  编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且

易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用  的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出  等。所以一般不提倡用递归算法设计程序。

所以在设计递归算法时需要确定递归公式边界(终了)条件

所以答案应选B。


求最大公约数的最常用的算法是欧几里得算法,也称为辗转相除法.


问题定义为求i和j的最大公约数gcd(i,j),其中i和j是整数,不妨设i>j.

算法可以递归的表示:

1.如果j能整除i,那么gcd(i,j)=j;

2.j不能整除i,令r=i%j,那么gcd(i,j)=gcd(j,r).

使用C语言实现:

1
2
3
4
5
int  gcd( int  i,  int  j)
{
     int  r = i % j;
     return  r == 0 ? j : gcd(j, r);
}
正确性分析:

算法的步骤1,显然成立(最大公约数定义).关键是要证明步骤2.

设d是i和j的最大公约数,

那么i=md,j=nd,m和n互质(否则d不是最大公约数).

由r=i%j可以得到i=kj+r,k=⌊m/n⌋,k≥1(我们前面假设过i>j).

把i=md,j=nd代入得到

md=knd+r

那么

r=(m-kn)d


m-kn和m也是互质的.


所以得到d是j和r的最大公约数.

时间复杂度分析:

逆着看该算法,最后的余数是0,倒数第二次余数是d,倒数第三次是kd,k>1…

由于组成了一个数列,{0,d,kd,nkd+d,…}

数列的n项加上n+1项,比n+2项要小,所以比斐波纳契数列增长的要快.

我们已知斐波纳契数列增长速度是指数,那么待分析的数列也是指数增长.

设欧几里得算法需要k次,那么j=O(2^k),则k=O(lg j).


所以欧几里得算法求最大公约数的时间复杂度是对数量级的,速度非常快.



B
【解析】
A缓存命中率提高,减少访问存储器的开销

B多线程并不能使IO操作并行化。可以通过异步读写、合并读写、计算代替读写等方式优化

C 数据库连接池可以有效减少频繁建立连接带来的时间消耗

D 迭代代替递归,减少栈空间的使用和中间值的保存

E减少远程调用的次数

F共享冗余,提高效率,加快访问



f(x) 当x大于0时,返回x*f(x-1),否则返回2

f(0) = 2
f(1) = 1 * f(0) = 2
f(2) = 2 * f(1) = 4
f(3) = 3 * f(2) = 12
f(4) = 4 * f(3) = 48
f(4) = f(f(2))   = 48

选B




快速排序的 递归的次数与 初始 数据的排列顺序有关, 递归次数与每次划分后得到的分区处理顺序无关


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhisheng_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值