2012-03-01 79 views
3

如果超過8個,我試圖分割子數組。我曾嘗試在播放器上調用rps_tournament_winner函數,如果它的扁平長度超過16但我得到一個「堆棧太深的錯誤」。在多維嵌套數組上調用遞歸函數的問題

我必須參加球員變數或錦標賽嗎?我正在尋找正確的方向;不是完整的解決方案。

def rps_tournament_winner(tournament) 
    return rps_game_winner(tournament) if tournament.flatten.length == 4 
    players = tournament.flatten(2) 

    while players.length > 1 
    players = players.each_slice(2).map { |x| rps_game_winner(x) } 
    end 

    players[0] 
end 
+1

看起來像你遞歸調用函數而不修改參數之前這樣做。這會導致無限循環。您需要首先以某種方式減少參數「比賽」。 – Madbreaks 2012-03-01 20:21:30

+0

因此,如果我檢查長度,如果它超過一定的長度,我可以將它分成兩個較小的數組,並在每個數組上調用比賽功能? – 2012-03-01 20:27:36

+0

Got it排序,謝謝。能夠調整If語句並使其完美運行。謝謝您的幫助! – 2012-03-03 07:38:53

回答

1

我解決它使用遞歸

class WrongNumberOfPlayersError < StandardError ; end 
class NoSuchStrategyError < StandardError ; end 

def rps_game_winner(game) 
    raise WrongNumberOfPlayersError unless game.length == 2 
    if game[0][0].is_a?(Array) then 
    winner1 = rps_game_winner(game[0]) 
    winner2 = rps_game_winner(game[1]) 
    game = [winner1, winner2] 
    end 
    raise NoSuchStrategyError unless /^(P|R|S){2}$/ =~ game[0][1] + game[1][1] 
    case game[0][1] 
    when "R" 
     if game[1][1] == "P" then 
     game[1] 
     else 
     game[0] 
     end 
    when "P" 
     if game[1][1] == "S" then 
     game[1] 
     else 
     game[0] 
     end 
    when "S" 
     if game[1][1] == "R" then 
     game[1] 
     else 
     game[0] 
     end 
    end 
end 

def rps_tournament_winner(tournament) 
    rps_game_winner(tournament) 
end 
+0

酷=)我喜歡總是有多種方式來解決編程問題(我是相當新的編程) – 2012-03-06 10:28:55

0

只有回答這個關閉的問題,希望我的回答可以幫助另外一個人= d

盯着它約三小時後,腦子裏卻停止午睡,我想出了這樣的:

def rps_tournament_winner(tournament) 
    return rps_game_winner(tournament) if tournament.flatten.length == 4 
    if tournament.flatten.length == 16 
    players = tournament.flatten(2) 
    else 
    players = tournament.flatten(4) 
    end 

    while players.length > 1 
    players = players.each_slice(2).map { |x| rps_game_winner(x) } 
    end 

players[0] 
end 

如果聲明讓我檢查,如果8名或更多的球員錦標賽(測試只是爲8,16和32級的球員,所以我懷疑日是爲更大的集合工作)我以前的問題是,我只會flatten(2)這對於較大的錦標賽是行不通的。

6

這是我能夠想出(遞歸)

def rps_tournament_winner(games) 
    if games.flatten.length > 4 
    rps_game_winner([rps_tournament_winner(games[0]), rps_tournament_winner(games[1])]) 
    else 
    rps_game_winner(games) 
    end 
end 
+0

我認爲遞歸是要走的路,很好的解決方案= D – 2012-03-06 19:45:38

+0

是的,當我意識到「flatten」可以被使用時,它就變得很明顯,而且它打擊了我:)。謝謝 :) – Watto 2012-03-06 21:52:06

5

這也是一個很好的解決方案瓦特最短/ O壓平陣列:

def rps_tournament_winner(tournament) 
    if tournament[0][0].is_a?(Array) 
     tournament =[rps_tournament_winner(tournament[0]), rps_tournament_winner(tournament[1])] 
    end 
    rps_game_winner(tournament) 
end