如何修复Swift中isIncreasing函数的布尔值返回逻辑问题?
修复Swift中isIncreasing函数的布尔值逻辑问题
你的代码存在几个关键问题,导致无法正确判断数组是否符合非递减要求,以下是具体分析和修复方案:
原代码问题分析
func isIncreasing(_ l: [Int]) -> Bool { var flagreturn=true if l.count == 0 { flagreturn=true } else { for i: Int in l { if l[i] < l[i + 1] { flagreturn=true } else{ flagreturn=false } } } return flagreturn }
- 遍历逻辑错误:
for i: Int in l是遍历数组的元素值而非索引,比如数组[1,2,3]中i会取1、2、3,用l[i]会直接触发数组越界崩溃。 - 布尔值覆盖问题:每次循环都会重置
flagreturn,哪怕前面已经出现递减情况,后续循环可能将其改回true,最终结果只取决于最后一次循环的判断。 - 判断条件错误:非递减允许元素相等,应该检测是否出现
前元素 > 后元素的递减情况,而非用<判断递增。
修复后的代码方案
方案一:基于索引遍历(直观易读)
func isIncreasing(_ l: [Int]) -> Bool { guard l.count > 1 else { return true } // 空数组或单个元素直接返回true for index in 0..<l.count - 1 { if l[index] > l[index + 1] { return false // 一旦发现递减,立即终止并返回false } } return true // 所有相邻元素都满足非递减,返回true }
方案二:用Swift高阶函数简化代码
func isIncreasing(_ l: [Int]) -> Bool { zip(l, l.dropFirst()).allSatisfy { $0 <= $1 } }
zip(l, l.dropFirst())将数组元素与下一个元素配对,比如[1,2,3]会生成(1,2)、(2,3)两组数据allSatisfy { $0 <= $1 }检查所有配对是否满足前元素小于等于后元素,只要有一组不满足就返回false
关键优化点
- 提前终止:发现不符合条件的元素对时立即返回,避免无效遍历
- 索引安全:使用
0..<l.count - 1的索引范围,彻底避免越界 - 逻辑准确:用
<=匹配非递减规则,用>精准检测异常情况
内容的提问来源于stack exchange,提问作者tyoung1385
相关产品推荐
相关产品推荐

