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