【问题标题】:Why does this implementation of quicksort return from a void function?为什么快速排序的这种实现从 void 函数返回?
【发布时间】:2013-04-23 10:40:19
【问题描述】:
#include<iostream>
using namespace std;

template <class Item>

void quicksort(Item a[], int l, int r)
{
    if (r <= 1) return;

    int i = partition(a, l, r);
    quicksort(a, l,   i-1);
    quicksort(a, i+1, r);
}

这个程序取自 Robert Sedgewick 的 Algorithms in C++。我对这个程序有一个困惑。我们正在使用具有void 返回类型的函数。我们正在使用return。如果return不返回任何值,这个程序会做什么?

【问题讨论】:

  • 让答案流动起来:)
  • 你得到一个赞成票,你得到一个赞成票,每个人都得到一个赞成票:P
  • @Named 是的,对问题和答案演变的有趣观察(但显然没有重复)...
  • 非常感谢 Guyz。真的是一个很棒的网站

标签: c++ sorting return quicksort void


【解决方案1】:

如果r 小于或等于1,则return 从函数“返回”到调用函数。它基本上告诉您,如果r 不是2 或更大,则继续没有意义。

另见If void() does not return a value, why do we use it?

【讨论】:

    【解决方案2】:

    您使用return 是为了不继续执行函数的其余部分。

    正如它的名字所说..它从函数返回

    返回后的代码不运行。

    (阅读其他 100 个答案,您将永远不会忘记这一点)。

    【讨论】:

      【解决方案3】:

      它实际上并没有返回一个值。 return 语句所做的只是终止函数

      你不想

      int i=partition(a,l,r);
      qucksort(a,l,i-1);
      qucksort(a,i+1,r);
      

      如果

      if(r<=1)
      

      在相关说明中,我个人认为它是更好的形式

      if(r>1)
      {
          int i=partition(a,l,r);
          qucksort(a,l,i-1);
          qucksort(a,i+1,r);
      }
      

      【讨论】:

        【解决方案4】:

        return 部分只是一个提前终止命令。如果r&lt;=1 为真,它将停止该函数,并阻止其余代码运行。这段代码的要点是,如果您有一个或零个元素,则不需要排序。

        【讨论】:

          【解决方案5】:

          如果满足条件,它只是用于在该点结束函数。

          【讨论】:

            【解决方案6】:

            具有void 返回类型的函数中的return 语句简单地退出函数并返回给它的调用者。然后控制流从下一条指令或表达式求值继续。

            另请注意,void-returning 函数的末尾流出等效于 return 语句,例如:

            return;
            

            【讨论】:

              【解决方案7】:

              在您的示例中,return 仅用于退出函数,即返回到调用它的位置。

              【讨论】:

                【解决方案8】:

                看到这个答案:Can I return in void function?

                在这种特定情况下,我的猜测是作者打算这样做是为了阻止函数的进一步执行。

                【讨论】:

                  【解决方案9】:

                  void 函数中的 return 语句会立即退出该函数。这里使用了return 语句,以便如果要对大小为 0 或大小为 1 的数组进行排序,则该函数不对其执行任何操作并且不会继续递归。该函数也可以使用if 语句编写,如下所示:

                  template <class Item> void quicksort(Item a[], int l, int r) {
                      if (r > 2) {
                          int i = partition(a, l, r);
                          quicksort(a, l,   i-1);
                          quicksort(a, i+1, r);
                      }
                  }
                  

                  此函数与您的原始版本的函数含义相同,但未明确包含return 语句。

                  希望这会有所帮助!

                  【讨论】:

                    【解决方案10】:

                    如果return后面不指定任何值,则表示返回void

                    return; 
                    

                    不会返回任何与 quicksort 函数声明的 void 返回类型匹配的内容。这也意味着在这种情况下它将返回给quicksort函数的调用者。

                    【讨论】:

                      猜你喜欢
                      • 2016-02-17
                      • 2019-10-11
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-06-21
                      • 2017-09-27
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-06-02
                      相关资源
                      最近更新 更多