В очень простой программе для сравнения двух связанных списков у меня есть рекурсивная функция, которая проверяет, совпадает ли текущий узел обоих списков, и затем перемещается к следующему узлу.
Базовый случай, если два узла равны нулю, мы выходим.
Так что код с if / else
есть:
func compareLL(llistOne: SinglyLinkedListNode?, llistTwo: SinglyLinkedListNode?) -> Bool {
if (llistOne == nil && llistTwo == nil) { return true }
if (llistOne?.data == llistTwo?.data) {return compareLL(llistOne: llistOne?.next, llistTwo: llistTwo?.next)}
return false
}
с охраной
func compareLL(llistOne: SinglyLinkedListNode?, llistTwo: SinglyLinkedListNode?) -> Bool {
guard (llistOne != nil && llistTwo != nil) else {return true}
if (llistOne?.data == llistTwo?.data) {return compareLL(llistOne: llistOne?.next, llistTwo: llistTwo?.next)}
return false
}
Так почему же они дают разные результаты?
То есть, сравнивая два разных связанных списка (разной длины) - поэтому мы возвращаем true при llistOne = 5
и list 2 = nil
в соответствии с оператором guard (и это не относится к оператору if then else). Это неожиданно, так как я думал, что они должны получить тот же результат.
Как мне разработать защитное выражение, чтобы оно выглядело так же, как и шаблон if?