You could also use an inner function that closes over the array that you're 
pushing onto:

function subsetsum(m::Int, n::Int, w::Array{Int,1}, x::Array{Bool,1},
                       s::Int, k::Int, r::Int)
    result = Array{Int}[]
    function inner(s, k, r)
        local j::Int = 0
        x[k] = true
        if s + w[k] == m
            push!(result, w[find(x[1:k])])
        else
            if s + w[k] + w[k+1] <= m
                inner(s+w[k], k+1, r-w[k])
            end
        end
        if s + r - w[k] >= m && s + w[k+1] <= m
            x[k] = false
            inner(s, k+1, r-w[k])
        end
    end
    inner(s, k, r)
    return result
end

This way, you only need to pass the arguments that are changing to the 
recursive calls.

On Wednesday, June 25, 2014 8:27:18 AM UTC-4, Mauro wrote:
>
> Could you pass a storage array to the function? Like so: 
>
>     function subsetsum(m::Int, n::Int, w::Array{Int,1}, x::Array{Bool,1}, 
>                        s::Int, k::Int, r::Int, sol::Array{Bool,1}) 
>         local j::Int = 0 
>         x[k] = true 
>         if s + w[k] == m 
>             push!(sol, w[find(x[1:k])]) 
>         else 
>             if s + w[k] + w[k+1] <= m 
>                 subsetsum(m, n, w, x, s+w[k], k+1, r-w[k], sol) 
>             end 
>         end 
>         if s + r - w[k] >= m && s + w[k+1] <= m 
>             x[k] = false 
>             subsetsum(m, n, w, x, s, k+1, r-w[k], sol) 
>         end 
>     end 
>
> > *The problem is*: Solutions found are printed to the console. 
> > Of course, I would like to store all solutions, for instance in a 
> Boolean 
> > array of size  k x n  where  k  is the number of solutions. 
> > I managed to do this with a global array  X  but I assume this will make 
> > the algorithm considerably slower because 
> > 
> >    1. as I learned here, usage of globals slows Julia down 
> >    2. it is unknown how many solutions there are, so the array will have 
> to 
> >    grow 
>
> I think there are three approaches: 
> - do as you did/above 
> - if you have an idea of the number of solutions, use 
>   `sizehint(sol, numsols)`.  Or do sizehints in big junks. 
> - run the computation twice, once to compute the number of solutions, 
>   the second time around to fill the `sol` array. 
>
> No idea which one is fastest. 
>

Reply via email to