【发布时间】:2020-01-08 23:32:12
【问题描述】:
在下面的整数类型的二分查找函数返回值中,当递归调用时,为什么要在else if语句中都使用返回值呢?如果我,代码将不起作用 直接使用递归调用而不是使用它作为回报。
int binarysearch(int l,int h,int key)
{
int mid;
mid=(l+h)/2;
if(l<=h)
{
if(key==a[mid])
return mid;
else if(key>a[mid])
return(binarysearch(mid+1,h,key));
else if(key<a[mid])
return(binarysearch(l,mid-1,key));
}
else
return -1;
}
【问题讨论】:
-
相关:这个函数需要重写,以便只有一个递归调用。它应该以
return binarysearch(low, high, key);之类的结尾。否则你只会产生一个非常慢的膨胀函数,它比仅仅编写一个循环要糟糕得多——因为编译器不能尾调用优化它。这反过来又表明在这种情况下绝对不需要使用递归。首先问自己“为什么我在这里使用递归”?看看你是否能想出另一个答案,而不是“因为我正在学习递归”。 -
如果我使用低=中+1。然后,如果我按照您所说的将其放在函数内部 binarysearch(low,high,key) 。有什么区别
-
不同之处在于,如果您有多个带有递归调用的“分支”(if else 场景),则参数计算将发生在这些分支中,您无法确定编译器可以优化掉递归调用。 (我为 x86 尝试了 gcc 和 clang,结果他们可以优化这个特定的代码,但我不会指望它。)
-
@Lundin 该功能不能非常慢。它的运行时复杂度仍然是 O(log n),对于所有实际用途来说已经足够快了。
-
@Lundin 我们是在真空中讨论的,没有衡量性能问题,也不知道整个具体程序的瓶颈。首先,我不会递归地编写该函数。但是,我也不会为优化具有 O(log n) 最坏情况复杂度的函数而烦恼,除非它是一个瓶颈。对我来说,过早意味着“生命周期过早”。