Я хочу написать хорошую реализацию бинарного поиска в Swift, и следующее выглядит как хак, чтобы преодолеть преодоление нижней и верхней границ во всех случаях.
func binarySearch(arr: [Int], target: Int, _ lowerBound: Int? = 0, _ upperBound: Int? = 0) -> Int? {
var ub = upperBound
if (ub == 0 ) { ub = arr.count
}
Подробное объяснение: янаписал набор тестов в форме: XCTAssertEqual(binarySearch(arr: [1,2,3,4], target: 5), nil)
и я не хочу передавать нижнюю и верхнюю границу в двоичный поиск в первом случае.
Мой заголовок функции выглядит:
func binarySearch(arr: [Int], target: Int, _ lowerBound: Int? = 0, _ upperBound: Int? = 0) -> Int? {
в каждом рекурсивном вызове бинарного поиска нижняя граница будет либо нулевой, либо переданным параметром, и это имеет смысл.Но верхняя граница не дает.
Теперь я хотел бы написать что-то вроде
func binarySearch(arr: [Int], target: Int, _ lowerBound: Int? = 0, _ upperBound: arr.count) -> Int? {
, но, очевидно, это невозможно.
Я бы даже хотел добавитьследующее (но явно не может, так как upperBound является константой let):
if (upperBound == 0 ) {upperBound = arr.count}
Я бы хотел использовать:
func binarySearch(arr: [Int], target: Int, _ lowerBound: Int? = 0, _ var upperBound: Int? = 0) -> Int? {
, но похоже, что это уже неособенность в swift.
Мне осталось использовать дополнительную переменную следующим образом, потому что это беспорядок!
func binarySearch(arr: [Int], target: Int, _ lowerBound: Int? = 0, _ upperBound: Int? = 0) -> Int? {
var ub = upperBound
if (ub == 0 ) {ub = arr.count}