Если у меня есть рекурсивная функция, которая создает кортеж, где в каждой функции она создает новый кортеж, добавляя / добавляя элемент к кортежу, лучше ли увеличивать его по направлению вперед или назад? Это имеет значение? Является ли один из них проще для компилятора, даже если он в конечном итоге выполняет то же самое?
Возьмите эту глупую функцию в качестве примера и представьте, что мне все равно, будут ли числа увеличиваться или уменьшаться (так как я всегда можно настроить вызывающий код так, чтобы он работал в любом случае):
julia> function tuple_one_through_n(n, t=())::Tuple
if n === 0
t
else
tuple_one_through_n(n-1, (n, t...))
end
end
tuple_one_through_n (generic function with 2 methods)
julia> tuple_one_through_n(5)
(1, 2, 3, 4, 5)
Есть ли основания предпочитать брызги t
до n
или после? Спасибо!
РЕДАКТИРОВАТЬ: Для большего контекста: мы добавляем кортежи подобным образом, потому что мы фактически используем это как неизменяемую трассировку функции, а создание нового кортежа путем добавления является потокобезопасным, поэтому он работает, даже если мы порождаем новые задачи: каждая задача получит свой собственный растущий след стека, который отслеживает всех вызывающих.
Я думаю, что лучшим вариантом, вероятно, будет что-то вроде неизменного PersistentVector
из https://github.com/JuliaCollections/FunctionalCollections.jl/blob/master/README.md, но для самого простого первого прохода я просто использовал кортежи, и мне было интересно, есть ли какая-либо причина отдавать предпочтение тому или иному заказу. :) Поскольку у некоторых людей, вероятно, есть действительный вариант использования для выращивания кортежей, я подумал, что спросить.