Julia中last()函数在自定义函数内报未定义错误如何解决
报错核心原因
你遇到的函数内last未定义、函数外正常的问题,是Julia局部作用域规则+代码笔误共同导致的:
你在函数内部写了last(new_intervals) = [xxx]这样的代码,在Julia语法中,函数名(参数) = 表达式是定义函数的标准写法,这行代码相当于在当前函数的局部作用域内声明了一个名为last的局部函数。根据Julia的作用域规则,整个局部作用域内所有对last的引用都会优先指向这个你还没定义完成的局部last,而不是全局自带的Base.last,所以当你在if判断行先调用last(new_intervals)时,就会抛出未定义错误;在函数外部没有这个局部last的声明,所以调用的是系统自带的last,能正常运行。
除此之外你的代码还有多处逻辑和笔误:
- 变量名前后不一致:初始化时用的是单数
new_interval,后续调用全写成了复数new_intervals - 排序逻辑错误:
sort!的by参数写的是x -> intervals[1],永远取整个输入数组的第一个元素,没有按每个区间自身的首元素排序 - 赋值语法错误:Julia不支持直接给函数调用结果
last(new_intervals)赋值 - 函数误用:
minimum!/maximum!是就地修改集合的函数,不能直接传入两个标量做最值计算,且代码里写的intervals[2]是笔误,应该取当前遍历到的区间的第二个元素 - 缺少返回值,函数执行完没有返回合并后的结果
- 初始化结果时直接引用原数组的第一个区间,后续修改会污染原输入数据
修复后可运行代码
function mergeOverlappingIntervals(intervals) # 处理空输入边界情况 isempty(intervals) && return [] # 按每个区间的起始值升序排序 sort!(intervals, by = x -> x[1]) # 初始化结果列表,拷贝第一个区间避免修改原输入数据 merged = [copy(intervals[1])] for i in 2:length(intervals) current_interval = intervals[i] last_merged = last(merged) # 区间重叠则合并 if last_merged[2] >= current_interval[1] last_merged[2] = max(last_merged[2], current_interval[2]) else # 不重叠则直接加入结果列表 push!(merged, copy(current_interval)) end end return merged end
验证示例
调用示例:
julia> mergeOverlappingIntervals([[1,3],[2,6],[8,10],[15,18]]) 3-element Vector{Vector{Int64}}: [1, 6] [8, 10] [15, 18]
符合区间合并的预期结果。
内容的提问来源于stack exchange,提问作者Harneet.Lamba
相关产品推荐
相关产品推荐

