Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在使用递归调用时,为什么要使用return语句?_C_Sorting - Fatal编程技术网

C 在使用递归调用时,为什么要使用return语句?

C 在使用递归调用时,为什么要使用return语句?,c,sorting,C,Sorting,在下面返回整型值的二进制搜索函数中,当存在递归调用时,为什么要在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])

在下面返回整型值的二进制搜索函数中,当存在递归调用时,为什么要在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;
}
int-binarysearch(int-l、int-h、int-key)
{
int mid;
mid=(l+h)/2;
如果(la[中间])
返回(二进制搜索(mid+1,h,键));

否则如果(键当其返回值的类型为
int
时,函数必须返回值。它返回的每个位置都必须返回值。当当前函数调用进行的递归调用返回时,它会给出答案;您必须将该答案返回到调用上下文-递归链上的下一级或原来电者


如果不返回值,则调用,这是一件坏事!™

如果函数的原型定义其返回类型为非void数据,则必须在该函数体中返回原型中指定类型的值。 请注意,在函数的原型中,必须显式返回“int”类型的值:

int binarysearch(int l, int h, int key);
在其函数体中有一些条件。这些条件导致不同的执行指令。您需要验证,在每个语句末尾,函数返回的相同类型的值实际上将被返回

如果不想使用return,则函数应具有以下原型:

void binarysearch(int l, int h, int key, int *mid);

在这种情况下,您可以使用指针从该函数的内部上下文中检索“mid”的值。

不清楚您在问什么。我想您需要一个返回语句,可以通过编辑函数来完成:

extern int a[];
int binarysearch(int l,int h,int key)
{
  int mid;
  mid=(l+h)/2;
  if(l<=h) {
    if(key>a[mid]) {
      mid = binarysearch(mid+1,h,key);
    } else if(key<a[mid]) {
      mid = binarysearch(l,mid-1,key);
    }
  } else {
    mid = -1;
  }
  return mid;
}

这似乎满足了它。

如果您愿意,您可以在外部变量中维护答案,并使用指向它的指针,为函数提供一个void返回类型。在我的公司,我们的编码标准不允许在返回中包含这种类型的构造,因为它很难测试。@rallen911-并且变得线程不安全,更难执行使用。但是您也可以修改函数以返回
void
(nothing),如果它不返回任何内容,那么显然您不会在
return
语句中返回值。@rallen911 well递归函数可能比只在
return
语句中调用函数而不返回值更难测试(通过到达闭合撑杆)从声明为返回值的函数调用不会导致未定义的行为。调用方使用未返回值的函数的返回值会导致行为不由C标准定义。@EricPostIschil-是,但我试图让tyro理解我的答案。这种差异通常可以忽略,但并不总是可以忽略。特别是,这种差异不会对递归搜索代码有意义。相关:此函数需要重写,以便只有一个递归调用。它应该以类似
return binarysearch(低、高、键)的内容结束
。否则,您只会生成一个非常慢的膨胀函数,这比只编写一个循环要糟糕得多,因为编译器无法对其进行尾部调用优化。这反过来又表明,在这种情况下,绝对不需要使用递归。请先问问自己“为什么我在这里使用递归?”?看看你是否能想出除“因为我在学习递归”之外的另一个答案。如果我使用low=mid+1。然后如果我像你说的那样将它放在函数中,比如binarysearch(low,high,key)。区别是什么?区别是如果你有几个“分支”(if-else场景)对于递归调用,参数计算将在这些分支中进行,您无法确定编译器是否可以优化递归调用。(我尝试了针对x86的gcc&clang,结果发现它们可以优化此特定代码,但我不指望它。)@Lundin说,函数的速度不能太慢。它的运行时复杂性仍然是O(logn),这对于所有实际目的来说都是足够快的。@Lundin我们在真空中讨论,没有衡量性能的问题,也不知道整个具体程序的瓶颈。首先,我不会递归地编写该函数。但是,我不会用O(logn)来优化函数最坏情况下的复杂性也是如此,除非它是一个瓶颈。对我来说,过早意味着“生命周期太早”。第一句话不是真的。C标准允许声明返回值的函数不返回值(通过到达右括号)如果调用方不尝试使用返回值,则使用“return”子句中断void函数是一种糟糕的编程实践。任何void函数都可以完美地执行,而不必使用“return”中断它.我的解决方案解释了如何使用最佳实践进行编程!使其工作并不意味着它是正确的!我的评论不是关于“无效函数”我想你指的是返回类型为
void
的函数。它是关于一个声明为返回类型不是
void
的函数。这个答案的第一句话是错误的:C标准不要求返回类型为non-
void
的函数返回值,这样做本身不会导致标准中未定义的行为。“虚假警告”是因为
if
/
else if
/
else if
没有
else
的链。如果使用了
else
,则函数不会返回值。它需要(很多)更多的分析来认识到最后一个
else if
中的条件是多余的和重复的。从
else if(a>b)
中删除
if(a>b)
条件,或者添加一个
else返回-1;
(或
-42
-这是生命、宇宙和一切的答案)。你可以
if (a == b) {
    return ...;
} else if (a < b) {
    return ...;
} else if (a > b) {
    return ...;
}
return -42;