2015-08-08 36 views
0

我有一個電路板(多維數組)。您從左上角開始,可以向右或向下移動。基本情況是右下角。如何從遞歸函數返回數組

我做了一個功能,尋找板內所有可能的移動和它們的值。當到達基本情況時,移動和值將被存儲爲數組ARR_SUMNUM

ARR_SUMNUM = [] 
def arr_all_moves(ary,a=0,b=0,sum_num=0,directions="") 
    rows = ary.length 
    cols = ary[0].length 
    goal = rows-1 + cols-1 
    curr_num = ary[a][b] 
    sum_num += curr_num 
    if [a,b] == [rows-1,cols-1] 
    ARR_SUMNUM.push([sum_num, directions]) 
    return 
    end 
    if a == rows -1 
    return arr_all_moves(ary,a,b+1,sum_num,directions+="right ") 
    elsif b == cols -1 
    return arr_all_moves(ary,a+1,b,sum_num,directions+="down ") 
    end 
    arr_all_moves(ary,a,b+1,sum_num,directions+="right ") 
    directions.chomp!("right ") ##### I realize this was the source of all my issues 
    arr_all_moves(ary,a+1,b,sum_num,directions+="down ") 
    return ARR_SUMNUM 
end 

board = [ [1,3,4], 
      [5,6,999], 
      [8,9,10], 
      [11,12,13], 
      [2000,42,13] 
     ] 
p arr_all_moves(board) 

如何獲得此功能不恆定的工作就像ARR_SUMNUM和使用局部變量來代替?我嘗試使用arr_sumnum代替,但我得到一個空數組。

+0

你應該使用''而不是''左'''而不是''左'「,因爲那是什麼問題需要 –

回答

0

最簡單的方法可能就是將數組傳遞給每個調用,方法是將其設置爲方法參數之一。

def arr_all_moves(ary, a=0, b=0, sum_num=0, directions=" ", arr_sum_num=[]) 
    rows = ary.length 
    cols = ary[0].length 
    goal = rows-1 + cols-1 
    curr_num = ary[a][b] 
    sum_num += curr_num 
    if [a,b] == [rows-1,cols-1] 
    arr_sum_num.push([sum_num, directions]) 
    return 
    end 
    if a == rows -1 
    return arr_all_moves(ary,a,b+1,sum_num,directions+="right ", arr_sum_num) 
    elsif b == cols -1 
    return arr_all_moves(ary,a+1,b,sum_num,directions+="left ", arr_sum_num) 
    end 
    arr_all_moves(ary,a,b+1,sum_num,directions+="right ", arr_sum_num) 
    arr_all_moves(ary,a+1,b,sum_num,directions+="left ", arr_sum_num) 
    return arr_sum_num 
end 
0

有兩種方法,其中一種已經提到過,涉及將數組傳遞給遞歸函數調用。另一個將實際向上傳播數組並將其添加到調用函數中。

def arr_all_moves(ary,a=0,b=0,sum_num=0,directions=" ") 
    rows = ary.length 
    cols = ary[0].length 
    goal = rows-1 + cols-1 
    curr_num = ary[a][b] 
    sum_num += curr_num 
    if [a,b] == [rows-1,cols-1] 
    return [[sum_num, directions]] 
    end 
    if a == rows -1 
    return arr_all_moves(ary,a,b+1,sum_num,directions+="right ") 
    elsif b == cols -1 
    return arr_all_moves(ary,a+1,b,sum_num,directions+="left ") 
    end 
    return arr_all_moves(ary,a,b+1,sum_num,directions+="right ") + 
     arr_all_moves(ary,a+1,b,sum_num,directions+="left ") 
end 

board = [ [1,3,4], 
      [5,6,999], 
      [8,9,10], 
      [11,12,13], 
      [2000,42,13] 
     ] 
p arr_all_moves(board) 
0

這裏是一個可能的解決方案,您應該使用down代替left因爲我們穿越向右或向下的2-d陣列來達到右下角。

def arr_all_moves(ary, a=0, b=0, sum_num=0, directions=" ") 
    rows = ary.length 
    cols = ary[0].length 

    sum_num += ary[a][b] 

    if [a,b] == [rows-1,cols-1] 
    [] << [sum_num, directions] 
    elsif a == rows-1 
    arr_all_moves(ary, a, b+1, sum_num, directions+="right ") 
    elsif b == cols-1 
    arr_all_moves(ary, a+1, b, sum_num, directions+="down ") 
    else 
    arr_all_moves(ary, a, b+1, sum_num, directions+="right ") + 
    arr_all_moves(ary, a+1, b, sum_num, directions+="down ")  
    end 
end 

board = [ 
      [1,3,4], 
      [5,6,999], 
      [8,9,10], 
      [11,12,13], 
      [2000,42,13] 
     ] 

p arr_all_moves(board)