我正在尝试使用以下两种方法以递归方式遍历数组,直到底部,然后返回匹配结果。
你知道在网球锦标赛中他们如何从32场比赛开始,并且一对一地赢得胜利,最后只有一位获胜者?这就是我想在Ruby中复制的内容。
为了简单起见,我创建了一个始终返回第一个数组的match_winner
。然后,我将整个锦标赛数组发送到winner
,递归调用自己,直到找到一个对应于单个匹配的简单数组。
def match_winner(array_of_arrays)
return array_of_arrays[0]
end
def winner(tournament)
if tournament[0][0].is_a?(String)
return match_winner(tournament)
else
tournament.each{|e|
winner(e)
}
end
end
tournament = [
[["one", "two"],["three", "four"]],
[["five", "six"],["seven", "eight"]]
]
puts winner(tournament).inspect
哪个输出:
[[["one", "two"], ["three", "four"]], [["five", "six"], ["seven", "eight"]]]
我在此算法上尝试了不同的排列和变体,但我无法使其正常工作并仅返回最终获胜者。
有人在这里看到任何明显错误吗?
现在我正在呼叫winner
。
答案 0 :(得分:1)
我知道这个问题看起来已经得到了回答,但我只是做了同样的问题,我不得不说只是将each
更改为map
对我来说不起作用,因为代码发布,结果是第一轮获胜者的数组。对我有用的是:
def winner(tournament)
if tournament[0][0].is_a?(String)
return match_winner(tournament)
else
tournament.map!{|e| #use map!, because we need to apply winner() to new values
e=winner(e) #assign new value somewhere, so recursion can climb back
}
end
end
也许更有经验的开发人员可以解释为什么会这样。没有这两个提示它将无法正常工作。
是的,我知道“爆炸”是一种糟糕的编码风格,危险的高压危险,但这是我与Ruby的第二天,我想让它发挥作用。
而且,要理解递归,你必须理解递归。
答案 1 :(得分:0)
假设您总共有2 ^ n个游戏并且match_winner
正常工作:
def winner(game)
if game[0][0][0] == game[0][0][0][0]
match_winner( [ game[0], game[1] ] )
else
match_winner( [winner(game[0]), winner(game[1])] )
end
end
答案 2 :(得分:0)
您希望map
,而不是each
,并且,作为上述备注的评论者,您未在上述代码中致电winner
。
致电时:
tournament.each {...}
该方法实际上返回锦标赛,因此winner
返回。
您想要的是用
替换它tournament.map {...}
返回一个新的数组,包括在锦标赛的每个元素上调用“获胜者”。