如果数组为空,Julia 中的 sum 函数会出错

sum function in Julia is giving error if the array is empty

我正在尝试创建一个代码来识别数组中的元素是否是单调的。

我写了下面的代码并得到了错误-

function isMonotonic(array)
    if length(array) <= 2
        return true
    end
    check_up = []
    check_down = []
    for i in range(2, length(array))
        if array[i] <= array[i-1]
            append!(check_up, 1)
        end
        if array[i] >= array[i - 1]
            append!(check_down, 1)
        end
    end
    if sum(check_up) == length(array) - 1 || sum(check_down) == length(array) - 1
        return true
    else
        return false
    end
end
isMonotonic([1, 2, 3, 4, 5, 6 , 7])

我收到以下错误

Error: Methoderror: no method matching zero(::Type{Any})

我认为是因为我正在尝试总结empth数组,我想了解一般如何克服这个问题,我有上面代码的解决方案,但一般我想知道原因以及如何使用它。我不想先检查数组是否为空,然后再求和。

如果您想节省很多精力,最简单的解决方案就是:

my_ismonotonic(x) = issorted(x) || issorted(x ; rev=true)

如果 x 正向或反向排序,这将 return true,否则 false

我们也许可以使用支票提高效率,因此我们只需要调用一次 issorted

function my_ismonotonic(x)
    length(x) <= 2 && return true
    for n = 2:length(x)
        if x[n] > x[1]
            return issorted(x)
        elseif x[n] < x[1]
            return issorted(x ; rev=true)
        end
    end
    return true
end
# Alternatively, a neater version using findfirst
function my_ismonotonic(x)
    length(x) <= 2 && return true
    ii = findfirst(a -> a != x[1], x)
    isnothing(ii) && return true # All elements in x are equal
    if x[ii] > x[1]
        return issorted(x)
    else
        return issorted(x ; rev=true)
    end
end

循环检测第一次出现大于或小于第一个元素的元素,然后在这种情况发生时立即调用适当的 issorted。如果数组中的所有元素都相等,则循环遍历整个数组并且 returns true.

您的方法存在一些效率问题,但您收到实际错误消息的原因是因为给定输入,此表达式 sum(check_up) 或此表达式 sum(check_down) 将有效导致以下调用:

sum(Any[])

没有明显的 return 值,因为数组可以有任何类型,所以你会得到一个错误。如果您之前在函数中使用了以下内容:

   check_up = Int[]
   check_down = Int[]

那么你应该不会遇到同样的问题,因为:

julia> sum(Int[])
0

另请注意,append! 通常用于将矢量附加到矢量。如果您只想将单个元素添加到向量中,请使用 push!.