0

下面的代码是我的快速选择(与快速排序非常相似,只是它返回排序数组中的第 n 个项目,而不是整个排序数组)方法。输入是字符串数组(单词),如果给定单词​​已排序,我必须返回第 n 个索引的单词。

    static string QuickSelect(string[] lst, int index) {
        if (lst.Length == 1)
        {
            Console.Write(lst[0]);
            return lst[0];
        }

        else
        {
            int pivot = _r.Next(lst.Length); // pick a pivot by random number generator
            bool[] isDecre = new bool[lst.Length];
            string[] WordLeft, WordRight;
            int nLeft = 0, nRight = 0;

            for (int i = 0; i < lst.Length; i++) // compare values to pivot
            {
                if (i == pivot) continue;
                if (WordCompare(lst[pivot], lst[i]))
                {
                    nRight++;
                    isDecre[i] = false;
                }
                else
                {
                    nLeft++;
                    isDecre[i] = true;
                }
            }


            if (nLeft == index) // pivot was the (index)th item in the list
                return lst[pivot];

            else
            {

                WordLeft = new string[nLeft];
                WordRight = new string[nRight];
                int l = 0, r = 0;
                // divide list by saved comparison result
                for (int i = 0; i < lst.Length; i++)
                {
                    if (i == pivot) continue;
                    if (isDecre[i])
                    {
                        WordLeft[l] = lst[i];
                        l++;
                    }
                    else
                    {
                        WordRight[r] = lst[i];
                        r++;
                    }
                }

                if (nLeft > index)
                    return QuickSelect(WordLeft, index);
                else if (nLeft < index)
                    return QuickSelect(WordRight, index - nLeft - 1);
            }
        }
    }

问题是这段代码无法运行,抛出“并非所有代码路径都返回值”错误。我认为这与这部分有关:

if (nLeft == index) // pivot was the (index)th item in the list
    return lst[pivot];
// build left and right word lists
 ...
if (nLeft > index)
    return QuickSelect(WordLeft, index);
else if (nLeft < index)
    return QuickSelect(WordRight, index - nLeft - 1);

如果我在上面的“else if”之后加上一些“else”,错误就会消失。但是当枢轴是第n个索引字符串时,我不想构建左右单词列表。事实上,我认为这种检测到的非价值返回路径有点胡说八道。有什么解决方法吗?

4

3 回答 3

2

不,没有解决方法。

您必须在方法的所有路径中返回值抛出异常(不会在该方法中处理)。

编辑:

另一方面,您的条件:

if (nLeft == index) // pivot was the (index)th item in the list
    return lst[pivot];
// build left and right word lists
 ...
if (nLeft > index)
    return QuickSelect(WordLeft, index);
else if (nLeft < index)
    return QuickSelect(WordRight, index - nLeft - 1);

可以改成这样:

if (nLeft == index) // pivot was the (index)th item in the list
    return lst[pivot];
// build left and right word lists
 ...
if (nLeft > index)
    return QuickSelect(WordLeft, index);
return QuickSelect(WordRight, index - nLeft - 1);
于 2012-12-23T20:04:54.863 回答
0


if (nLeft > index)
return QuickSelect(WordLeft, index);
else if (nLeft < index)
return QuickSelect(WordRight, index - nLeft - 1);
else //nLeft== index
return "something";

如果两个条件都失败,那么你仍然需要返回一些值,你可以根据返回值进一步处理这种情况。

于 2012-12-23T20:11:45.057 回答
0

只有当指定的条件为真时,您的代码才会返回该值。由于您已经指定了三个条件,因此该方法只会在其中一个条件为真时返回一个值,但在这种情况下您会收到错误消息,因为如果这三个条件都为假,应用程序将不知道该怎么做。将没有返回值,因为您没有指定当这些条件变为 false 时将执行的操作,这就是您收到错误的原因,因为 bool 可以是truefalse

if (nLeft == index) //Continue if the condition becomes true
    return lst[pivot]; //Return a value
 ...
if (nLeft > index) //Continue if the condition becomes true
    return QuickSelect(WordLeft, index); //Return a value
else if (nLeft < index) //Continue if the condition becomes true
    return QuickSelect(WordRight, index - nLeft - 1); //Return a value

您应该在此方法中添加一行,它只是告诉应用程序在这些条件变为 false 时返回另一个值(a 的另一种可能性bool

例子

if (nLeft == index) //Continue if the condition becomes true
    return lst[pivot]; //Return a value
 ...
if (nLeft > index) //Continue if the condition becomes true
    return QuickSelect(WordLeft, index); //Return a value
else if (nLeft < index) //Continue if the condition becomes true
    return QuickSelect(WordRight, index - nLeft - 1); //Return a value
else //Continue if these conditions become false
    return /* value */; //Return a value

谢谢,
我希望你觉得这有帮助:)

于 2012-12-23T20:19:59.243 回答