1

我正在指导某人进行基本搜索和排序。在插入排序中,当我的值在数值上大于它之前的值时,我会进行否定迭代。现在当然这种方法可能会导致问题,因为有一个检查调用不存在的数组 [-1]。

如下面的粗体下划线所示,添加 and x > 0 布尔值可以防止索引问题。

我的问题是这是怎么回事?是否仍会调用 array[-1] 以确保两个布尔值的有效性?

the_list = [10,2,4,3,5,7,8,9,6]

for x in range(1,len(the_list)):
    value = the_list[x]


    while value < the_list[x-1] **and x > 0**:

        the_list[x] = the_list[x-1]

        x=x-1

    the_list[x] = value

print the_list
4

2 回答 2

0

我不确定我是否完全理解了这个问题,也不知道这是什么编程语言,但大多数现代编程语言默认使用所谓的短路布尔评估,因此逻辑表达式不会进一步评估一次结果是已知的。

您可以使用它来防止范围溢出,如下所示:

while x > 0 and value < the_list[x-1]

但是这里对x的范围的检查必须在使用之前进行。

于 2013-04-11T20:27:39.200 回答
0

AND当且仅当两个参数都为真时,操作才会返回true,因此如果其中一个参数为假,则没有必要检查其他参数,因为此时已经知道最终值。至于您的示例,通常评估从左到右进行,但这不是原则,并且看起来您使用的语言不遵循该规则(否则它仍然应该在数组查找时崩溃)。但可能是,这个特定的实现以某种方式优化了它(恕我直言,这不是一个好主意)并x > 0在查找数组之前首先评估“更简单”的东西(比如检查 if )。x > 0检查规范为什么这个确切的顺序对你有用,因为在大多数流行的语言中,如果在查找之前不评估测试,你仍然会崩溃

于 2013-04-11T20:29:04.127 回答