【问题标题】:What are the benefits of `while(condition) { //work }` and `do { //work } while(condition)`?`while(condition) { //work }` 和 `do { //work } while(condition)` 有什么好处?
【发布时间】:2010-05-31 18:12:54
【问题描述】:

我发现自己面临一个面试问题,目标是编写一个排序算法,对一组未排序的int 值进行排序:

int[] unsortedArray = { 9, 6, 3, 1, 5, 8, 4, 2, 7, 0 };

现在我搜索了一下,发现外面有这么多sorting algorithms! 最后我可以激励自己深入研究Bubble Sort,因为它看起来很简单。

我阅读了示例代码并得出了一个如下所示的解决方案:

    static int[] BubbleSort(ref int[] array)
    {
        long lastItemLocation = array.Length - 1;
        int temp;
        bool swapped;

        do
        {
            swapped = false;
            for (int itemLocationCounter = 0; itemLocationCounter < lastItemLocation; itemLocationCounter++)
            {
                if (array[itemLocationCounter] > array[itemLocationCounter + 1])
                {
                    temp = array[itemLocationCounter];
                    array[itemLocationCounter] = array[itemLocationCounter + 1];
                    array[itemLocationCounter + 1] = temp;

                    swapped = true;
                }
            }

        } while (swapped);

        return array;
    }

清楚地看到这种情况,do { //work } while(cond) 语句很有帮助,并且可以防止使用另一个辅助变量。

但这是唯一更有用的情况吗?或者您知道使用此条件的任何其他应用程序吗?

【问题讨论】:

标签: programming-languages c#-4.0 while-loop conditional-statements


【解决方案1】:

一般:

  • 如果您希望正文至少执行一次,请使用do...while
  • 如果您可能根本不希望执行正文,请使用 while...

编辑:我会说第一个选项出现大约 10% 的时间,第二个大约 90%。在任何一种情况下,您都可以随时重新考虑使用其中任何一种。使用最接近你想说的话。

【讨论】:

  • 这就是我使用其中一个的原因。
【解决方案2】:

do...while 保证循环内的代码体至少执行一次 这在某些情况下很方便;例如,在编写 REPL 循环时。

【讨论】:

  • REPL 循环?你指的是Read-Eval-Print-Loop吗?
  • @Shaharyar:如果您正在编写 REPL 循环,请不要使用它。这只是一个非常简单的例子。
  • @RobertHarvey - 他的意思是模拟:“REPL Loop”==“Read Eval Print Loop Loop”
【解决方案3】:

任何时候你需要循环一些代码直到满足一个条件是一个很好的例子,说明何时使用 do...while 或 while...

何时使用 do...while 或 while... 的一个很好的例子是,如果您有一个游戏或模拟游戏,其中游戏引擎会持续运行各种组件,直到出现某种情况,例如您赢或输。

当然这只是一个例子。

【讨论】:

  • 您提供了一个示例,但是您没有说明哪个while 模式适合您的示例。
  • @Robert 基于问题“何时做而何时做”有帮助,这让我相信 OP 想要说明何时使用其中之一的示例,而不是解释何时使用其中一个。至于我与游戏有关的示例,我已经看到两者都用于那种特定情况。因此,我没有指定一个。
【解决方案4】:

以上帖子关于两种条件循环形式是正确的。有些语言有一个重复直到形式而不是do while。还有一种极简主义观点,认为语言中应该只存在必要的控制结构。 while do 是必要的,但 do while 不是。至于冒泡排序,你会想要避免去那里,因为它是众所周知的排序算法中最慢的。请改用选择排序或插入排序。快速排序和归并排序速度很快,但如果不使用递归则很难编写,并且如果您碰巧选择了较差的枢轴值,则性能会很差。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2013-02-05
    • 1970-01-01
    • 2011-05-06
    • 2013-11-18
    • 2012-09-04
    • 2013-08-18
    • 2014-01-14
    • 2013-04-10
    相关资源
    最近更新 更多