在一行条件语句中分配多个变量

问题描述 投票:0回答:1

在我的 Julia 课程中,我们看到了冒泡排序的基本实现:

function bubble_sort!(a)
    n = length(a)
    for i in 1:n-1
        for j in 1:n-i
            if a[j] > a[j+1]
                a[j], a[j+1] = a[j+1], a[j]
            end
        end
    end
    return a
end

作为练习,我试图将实际的排序部分压缩为单行条件,如下所示:

function bubble_sort_oneline!(a::Vector)
    n = length(a)
    for i in 1:n-1
        for j in 1:n-i
            (a[j] > a[j+1]) ? a[j], a[j+1] = a[j+1], a[j] : nothing
        end
    end
    return a
end

但是,Julia 返回语法错误:“‘?’中需要冒号”表达。在我看来,用逗号分隔分配会导致一些问题,但我不知道如何解决它。我怎样才能做到这一点?

function conditional-statements julia variable-assignment
1个回答
0
投票

你可以写

a[j] > a[j+1] ? begin a[j], a[j+1] = a[j+1], a[j] end : nothing
,或者因为你不需要三元组的第三部分,所以使用
&&
代替:

julia> function bubble_sort!(a)
           n = length(a)
           for i in 1:n-1, j in 1:n-i
               a[j] > a[j+1] && begin a[j], a[j+1] = a[j+1], a[j] end
           end
           return a
       end
bubble_sort! (generic function with 1 method)

julia> bubble_sort!(rand(1:99, 10))'
1×10 adjoint(::Vector{Int64}) with eltype Int64:
 4  18  24  25  28  56  87  89  92  95

如果没有逗号,您可以使用括号代替开始/结束,但解析器认为

a[j] > a[j+1] && (a[j], a[j+1] = a[j+1], a[j])
可能是 NamedTuple 的语法,并说
invalid named tuple element "a[j]"

julia> let x = 3
        rand()>0.1 && (x = 4)
        @show x; nothing
       end
x = 4

不过,原著可能更容易阅读。

© www.soinside.com 2019 - 2024. All rights reserved.