2012-03-13 65 views
0

我试图使用以下两个方法以递归方式遍历数组的数组直到底部,然后返回匹配结果。如何通过Ruby中的数组进行递归

你知道在一场网球比赛中,他们以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

你根本不叫'赢家'... – pezcode 2012-03-13 01:14:50

+0

所以['one','two']是一个游戏,'two'是赢家吗? – 2012-03-13 01:16:57

+0

你打电话给#match_winner,你已经硬编码,总是返回第一个值。大概你打算叫'赢家(锦标赛)'。 – 2012-03-13 01:18:07

回答

0

看起来像你想map,不each,并且,如上笔记提意见,你也没有告诉winner在上面的代码。

当你拨打:

tournament.each {...} 

该方法实际上返回了比赛,这是什么这样的回报winner

你想要的是与

tournament.map {...} 

返回由调用“赢家”比赛中的每个元素的新数组来代替它。

0

假设你拥有的游戏总是2^n个和match_winner作品OK:

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 
+0

什么是比赛变量?它是一个外部变量吗?它不应该是'游戏'吗? – 2012-03-13 01:31:33

+0

你是我的坏人,这是游戏。 – 2012-03-13 01:33:10

+0

但为什么3级?我的意思是,为什么[0] [0] [0]?根据我的规则,数组是一个有效的单个匹配,如果arr [0] [0] .is_a?(String)...对吗?你的例子中的 – 2012-03-13 01:47:39

1

我知道,这个问题看起来像它的回答,但我只是做了同样的问题,我不得不说,简单地改变eachmap并没有为我工作,因为,作为代码发布,结果是第一轮获胜者阵容。什么工作对我来说是:

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,我想这个工作。

而且,为了理解递归,你必须了解递归。