2015-05-18 96 views
3
function nestedLoop(depth::Integer, n::Integer, symbArr, len::Integer, k::Integer, num_arr) 
    for i = k:len 
    num_arr[depth-n+1] = symbArr[i] 
    n == 1 && println(num_arr) 
    (n > 1) && nestedLoop(depth, n-1, symbArr, len, i, num_arr) 
    end 
end 

function combwithrep(symbArr, n::Integer) 
    len = length(symbArr) 
    num_arr = Array(eltype(symbArr),n) 
    nestedLoop(n, n, symbArr, len, 1, num_arr) 
end 
@time combwithrep(["+","-","*","/"], 3) 

我從返回基本遞歸函數的值,計算重複組合的值有一些麻煩。我不知道如何提交println替換combwithrep()函數返回一些數組。我也沒有爲此使用任務。最好的結果是獲得這個值的迭代器,但在遞歸中是不可能的,不是嗎?如何將遞歸函數的值返回給數組

我覺得答案很簡單,我不明白遞歸的一些問題。

+0

包括並返回一個累加器在你的尾遞歸給你想要嗎? – rickhg12hs

+0

繼[[Combinations' iterator model]](https://github.com/JuliaLang/julia/blob/master/base/combinatorics.jl#L172)創建您自己的'Type',''length','start' ,迭代器的'next'和'done'將是一個很好的練習。 – rickhg12hs

+0

@ rickhg12hs如果我們在談論同一個問題,累加器就是一種計數器。其實,我自己需要組合,而不是櫃檯。但是,我似乎明白你對此不正確。例如,你可以顯示幾行代碼嗎? – korantir

回答

2

這當然不是最佳的,但它是功能性的。

julia> function nested_loop{T <: Integer, V <: AbstractVector}(depth::T, n::T, symb_arr::V, len::T, k::T, num_arr::V, result::Array{V,1}) 
      for i = k:len 
       num_arr[depth-n+1] = symb_arr[i] 
       n == 1 ? push!(result, deepcopy(num_arr)) : nested_loop(depth, n-1, symb_arr, len, i, num_arr, result) 
      end 
     end 
nested_loop (generic function with 1 method) 

julia> function combwithrep(symb_arr::AbstractVector, n::Integer) 
      len = length(symb_arr) 
      num_arr = Array(eltype(symb_arr),n) 
      result = Array{typeof(num_arr)}(0) 
      nested_loop(n, n, symb_arr, len, 1, num_arr, result) 
      return result 
     end 
combwithrep (generic function with 1 method) 

julia> combwithrep(['+', '-', '*', '/'], 3) 
20-element Array{Array{Char,1},1}: 
['+','+','+'] 
['+','+','-'] 
['+','+','*'] 
['+','+','/'] 
['+','-','-'] 
['+','-','*'] 
['+','-','/'] 
['+','*','*'] 
['+','*','/'] 
['+','/','/'] 
['-','-','-'] 
['-','-','*'] 
['-','-','/'] 
['-','*','*'] 
['-','*','/'] 
['-','/','/'] 
['*','*','*'] 
['*','*','/'] 
['*','/','/'] 
['/','/','/'] 
+1

你是我的英雄; D非常感謝。我試圖做類似的事情,但沒有'deepcopy()'。結果令人沮喪。也許我會稍後打開關於遞歸迭代器的下一個線程。 – korantir