我想实现二进制搜索整数数组.我确保数组按递增顺序排序.但我的功能是没有跟踪所有情况,一些检查失败.我在这里错过了什么?
Value代表我试图找到的整数.
bool search(int value, int array[], int n)
{
int left = 0;
int right = n - 1;
int middle = (left + right) / 2;
while (right >= left)
{
if (array[middle] == value)
return true;
else if (array[middle] < value)
right = middle;
else if (array[middle] > value)
left = middle + 1;
middle = (left + right) / 2;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我的猜测是没有预测到一些左边界或右边界的情况.我也不太了解while情况.
我目前对协议中的 gettable 属性有点困惑。考虑这个例子:
protocol Person {
var name: String { get }
}
Run Code Online (Sandbox Code Playgroud)
我希望该name属性是只读的,但我发现您可以在没有编译器投诉的情况下更改该值:
struct Driver: Person {
var name: String
}
var driver = Driver(name: "Ryan")
driver.name = "Changed!"
Run Code Online (Sandbox Code Playgroud)
如果我们driver用let关键字定义,那么编译器会引发错误,但如果我理解正确,它与协议无关,因为常量结构在 Swift 中设计为不可变的。
方法交互的行为与我预期的一样:
extension Person {
mutating func changeName(_ newName: String) {
self.name = newName // Error: 'name' is a get-only property
}
}
Run Code Online (Sandbox Code Playgroud)
我是 Swift 的新手,提到的细微差别可能没有任何实际用途,但是这种行为让我问自己,我是否对结构的工作方式缺乏一些基本的了解。