微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Julia合成中重复N次功能

如何解决在Julia合成中重复N次功能

我正在尝试制作一个由N次构成函数f(x)的函数,类似这样:

function CompositionN(f,N)
             for i in 1:N
                f(x) = f(f(x))
             end
return f(x)

我需要函数CompositionN返回另一个函数,而不是值。

解决方法

您可以利用函数,该函数可以组成多个函数:

julia> composition(f,n) = ∘(ntuple(_ -> f,n)...)
composition (generic function with 1 method)

julia> composition(sin,3)(3.14)
0.001592651569876818

julia> sin(sin(sin(3.14)))
0.001592651569876818
,

使用ntuple和喷溅处理的解决方案在一定数量的合成(例如10个)下效果很好,然后从性能悬崖上滑落。

使用reduce的另一种解决方案对于大量的合成n较快,而对于少量的合成则较慢:

compose_(f,n) = reduce(∘,ntuple(_ -> f,n))

我认为以下解决方案对于大型和小型n都是最佳的:

function compose(f,n)
    function (x)  # <- this is syntax for an anonymous function
        val = f(x)
        for _ in 2:n
            val = f(val)
        end
        return val
    end
end

BTW:在此处建议的方法中,组合函数的构造更快。结果函数的运行时似乎相同。

,

这是一种递归方法:

julia> compose(f,n) = n <= 1 ? f : f ∘ compose(f,n-1)
compose (generic function with 1 method)

julia> compose(x -> 2x,3)(1)
8

如果我们愿意进行一些类型的盗版,则可以在函数上使用幂运算符^来表示n阶自组合:

julia> Base.:^(f::Union{Type,Function},n::Integer) = n <= 1 ? f : f ∘ f^(n-1)

julia> f(x) = 2x
f (generic function with 1 method)

julia> (f^3)(1)
8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。