gpt4 book ai didi

ruby - 使用递归函数操作数组

转载 作者:太空宇宙 更新时间:2023-11-03 17:17:44 25 4
gpt4 key购买 nike

def rps_tournament_winner(tournament)
for i in 0..1 do
if tournament[i][1].is_a? Array then
rps_tournament_winner(tournament[i])
else
tournament=rps_game_winner(tournament)
return
end
end
return tournament
end

这是 Ruby 中剪刀石头布实现的一部分

rps_game_winner

接受格式为

的两个数组的数组
[ ["Allen", "S"], ["Omer", "P"] ]

其中第一个元素是玩家的名字,第二个元素是他们的决定并返回获胜者。

rps_tournament_winner

接受具有任意深度的嵌套数组的输入

[
[
[ ["Armando", "P"], ["Dave", "S"] ],
[ ["Richard", "R"], ["Michael", "S"] ],
],
[
[ ["Allen", "S"], ["Omer", "P"] ],
[ ["David E.", "R"], ["Richard X.", "P"] ]
]
]

我想做的是在函数取得进展时修改原始输入,但输入会在输入时出现。合并全局变量是一种解决方案,但这是一项需要使用自动评分器评分的工作,我怀疑它只是将一些输入直接推送到函数并比较输出,所以它不是一个选项。

最佳答案

原始代码的几个问题:

  • 将迭代与递归混合
  • 您丢弃递归的结果 (rps_tournament_winner(tournament[i]))
  • 你没有返回任何有用的东西(return 只是返回 nil,但这并不重要,因为你根本没有使用结果)

使用原始逻辑的固定版本是:

def rps_tournament_winner(tournament)
result = []
for i in 0..1 do
if tournament[i][0][0].is_a? Array then
result << rps_tournament_winner(tournament[i])
else
result << rps_game_winner(tournament[i])
end
end
return result
end

但实际上这相当于一个简单的

def rps_tournament_winner(tournament)
if tournament[0][0].is_a? String
rps_game_winner(tournament)
else
tournament.map { |t| rps_tournament_winner(t) }
end
end

使用对象会更好:

class Game < Struct.new(:player1, :choice1, :player2, :choice2)
def winner
'PRSP'.include?(choice1 + choice2) ? player1 : player2
end
end

def rps_tournament_winner(tourn)
return tourn.winner if tourn.is_a? Game
tourn.map { |t| rps_tournament_winner(t) }
end

关于ruby - 使用递归函数操作数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9540766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com