0

我是 C++ 新手,很难理解这个函数。有人可以带我过去吗?

int seqSearch(int [ ] list, int target)
{
    //precondition:  The list is in non-decreasing order
    //postcondition:  The method returns -1 if the target is not in the list.  If the target
    //is in the list, the method returns the index of the first occurrence of the target.
    int result = -1;
    boolean foundBigger = false;
    int i = 0;
    while (result == -1 && !foundBigger && i < list.length)
    {
        if (target == list[i])
            result = i;
        else if (list[i] > target)
            foundBigger = true;
        //endif
        i++;
    }  //endwhile
    return result;
}
4

5 回答 5

2

它试图查找列表中是否存在目标编号,其中列表中的编号按降序存储。

循环继续,

  1. 直到找不到目标。(条件:结果 == -1)(如果找到目标,则结果!= -1 并且循环中断,返回元素的索引。

  2. 或直到列表中的元素大于目标。(条件:!foundBigger)(由于列表是按降序排列的,如果它找到一个小于目标的数字,那么他们将没有机会在剩余列表中找到该数字。所以这意味着它不存在于列表和循环应该中断。)

  3. 或者直到整个列表都被渲染并且它没有被找到。(条件:i < list.length)

希望现在清楚。

于 2013-02-19T02:59:19.823 回答
1

嗯,“非递减顺序”。一个更好的词是升序:-)

该函数假定列表按升序排列。从列表中的第一项 (list[0]) 开始,与您要查找的项目(即“目标”)进行比较。如果相等,则将结果设置为索引“i”。如果不是,则增加 i 并继续循环。一项一项地检查每个项目,直到:

(a) 你找到“目标”,或者

(b)当前项目大于您的“目标”(此时退出,因为自从您的列表被订购以来没有任何意义)

返回值是您在列表中找到“目标”的索引,如果未找到,则返回 -1。

于 2013-02-19T02:56:57.557 回答
0

当结果为 == -1 且 foundBigger 为真时,您传递给函数的数组大小大于 0

然后它进入while循环

如果即使上述条件之一没有完全满足,那么它也不会进入循环,它只会返回 return 的值

然后,如果您使用目标参数传递给函数的值等于数组列表的 i 值,那么您将结果分配给 i 的值

如果目标值小于数组列表的 i 值,则 foundBigger 被分配为 true,因此当您进入 while 循环时,您无法满足上述条件

如果上述方法均无效,则 i 增加 1 并退出 while 循环

如果目标值不在数组中,它会一直运行,直到您找到目标值的保存位置,然后它将返回结果 -1

否则它将返回位置

于 2013-02-19T03:04:37.163 回答
0
// precondition:  The list is in non-decreasing order
// postcondition:  The method returns -1 if the target is not in the list.  If the target
// is in the list, the method returns the index of the first occurrence of the target.
int seqSearch(int [ ] list, int target)
{
    int result = -1;                                    // Set result to 'not-found' value
    // Also we want to stop search if smth bigger than `target' will be found
    // Remember the original list is assumed to be sorted, so first value
    // bigger than `target' means: no need to continue, it is guarantied that `target'
    // is nto here!
    boolean foundBigger = false;
    int i = 0;                                          // Initial index to start search
    // Repeat 'till `target' not found AND not found smth bigger that requested target
    // and current index less than the list size...
    while (result == -1 && !foundBigger && i < list.length)
    {
        if (target == list[i])                          // Is current item equal to the requested?
            result = i;                                 // Remember result index (this will break the loop)
        else if (list[i] > target)                      // Is current item bigger than the requsted?
            foundBigger = true;                         // Yep, will break the loop w/ no result to return
        //endif
        i++;                                            // move to next item in the list
    }  //endwhile
    return result;                                      // Return the result,  whatever it is
}
于 2013-02-19T03:04:54.900 回答
0

如果这是工作代码,那么它绝对不是 c++。while 循环中的布尔操作必须用单独的括号括起来以用于操作顺序,并且 c++ 没有数组的 .length 属性(java 允许这两者,这让我觉得它是用 java 编写的)。逻辑它的背后仍然保持不变。

您首先初始化结果 int(要返回的结果)和一个布尔值,用于检查您是否传递了所需的元素。只要你还没有找到你要找的东西并且你没有“通过”你继续前进的目标项目。

如果您找到了目标,那么您的结果 int 将更改为正确的索引,并且下次循环检查其条件时,索引将超过 -1 并表示一个实数,因此该方法将结束并返回一个索引。

第二个语句检查您是否已经通过了您正在寻找的 int。您知道列表是连续的,因此如果您当前所在的值高于您正在查找的值并且您没有找到该项目,那么您更改 foundBigger 布尔值,它将在下次检查条件时结束循环.

如果这些条件都不满足,那么您最终将超出列表搜索的末尾,因此一旦到达列表末尾,您就知道该项目不在列表中,因此您仍然返回 -1。

于 2013-02-19T03:06:47.880 回答