7.11牛客题(递归)

匿名 (未验证) 提交于 2019-12-02 23:47:01

1、对递归程序的优化的一般的手段为(A)
A 尾递归优化
B 循环优化
C 堆栈优化
D 停止值优化
解析:https://www.cnblogs.com/Alexander-Lee/archive/2010/07/21/1782543.html
尾递归

在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。 遗憾的是,大多数编程语言没有针对尾递归做优化。

以斐波那契数列为例子
普通的递归版本
int fab(int n){
if(n<3)
return 1;
else
return fab(n-1)+fab(n-2);
}
具有"线性迭代过程"特性的递归―尾递归过程
int fab(int n,int b1=1,int b2=1,int c=3){
if(n<3)
return 1;
else {
if(n==c)
return b1+b2;
else
return fab1(n,b2,b1+b2,c+1);
}
}
以fab(4)为例子


2、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是()
递归次数与每次划分后得到的分区处理顺序无关。
解析:
递归次数,取决于递归树,而递归树取决于轴枢的选择。树越平衡,递归次数越少。
快速排序的 递归的次数与 初始 数据的排列顺序有关。
递归次数和数据排列有关 若有序,这次数为0(N)。理论上最少的次数为0(logN)。
而对分区的长短处理顺序,影响的是递归时对栈的使用内存,而不是递归次数。先处理短的可以减小递归深度。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!