如何通过Ruby中的数组进行递归

时间:2012-03-13 01:08:41

标签: ruby recursion

我正在尝试使用以下两种方法以递归方式遍历数组,直到底部,然后返回匹配结果。

你知道在网球锦标赛中他们如何从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

3 个答案:

答案 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 {...}

返回一个新的数组,包括在锦标赛的每个元素上调用“获胜者”。