问题描述
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