Ruby:试图理解为什么我的代码有时工作得很好,但有时却陷入循环
所以我正在为App Academy的训练营做额外的准备工作,其中一个示例问题是创建一个方法swingers,它接受一个夫妇数组的参数,并返回一个类似的数组,其中夫妇混合在一起 论点的格式是这样的:([[男,女],[男,女]…) 我的问题是,在执行代码的大部分时间,我都会收到正确的输出。 但是,有时代码不执行,并陷入循环(我假设) 我肯定我还没有写出最好的代码,也许我可以改变一些东西来阻止这个问题 这是我的密码:Ruby:试图理解为什么我的代码有时工作得很好,但有时却陷入循环,ruby,oop,loops,random,multidimensional-array,Ruby,Oop,Loops,Random,Multidimensional Array,所以我正在为App Academy的训练营做额外的准备工作,其中一个示例问题是创建一个方法swingers,它接受一个夫妇数组的参数,并返回一个类似的数组,其中夫妇混合在一起 论点的格式是这样的:([[男,女],[男,女]…) 我的问题是,在执行代码的大部分时间,我都会收到正确的输出。 但是,有时代码不执行,并陷入循环(我假设) 我肯定我还没有写出最好的代码,也许我可以改变一些东西来阻止这个问题 这是我的密码: def swingers(couples) new_couples = []
def swingers(couples)
new_couples = []
target_size = couples.size
i = 0
males = couples.each_with_object([]) {|(male,female),arr| arr << male}
females = couples.each_with_object([]) {|(male,female),arr| arr << female}
until new_couples.size == target_size
while true
current_male = males[rand(0..males.size-1)]
current_female = females[rand(0..females.size-1)]
if !couples.include?([current_male,current_female])
break
end
end
males.delete(current_male)
females.delete(current_female)
new_couples[i] = [current_male, current_female]
i += 1
end
new_couples
end
p swingers([
["Clyde", "Bonnie"],
["Paris", "Helen"],
["Romeo", "Juliet"]
])
def摇摆器(成对)
新婚夫妇=[]
target_size=particles.size
i=0
男性=夫妇。每个带有对象([]){|(男性,女性),arr | arr的|u都会永远循环,因为这个测试:
if !couples.include?([current_male,current_female])
break
end
最后的两对夫妇有可能与他们原来的伴侣配对,在这种情况下,break
永远无法到达
例如,给定您的输入
["Clyde", "Bonnie"],
["Paris", "Helen"],
["Romeo", "Juliet"]
如果你的第一对是克莱德和海伦,第二对是帕里斯和邦妮,那就只剩下罗密欧和朱丽叶了。你的循环将测试是否['Romeo','Juliet']
存在于原始的组合中,它们确实存在,因此它将尝试生成一个新的配对,但只剩下一男一女,因此它永远不会逃脱您的,而为true
几个更适合我的注释
不要这样做:
males = couples.each_with_object([]) {|(male,female),arr| arr << male}
current_male = males[rand(0..males.size-1)]
不要这样做:
males = couples.each_with_object([]) {|(male,female),arr| arr << male}
current_male = males[rand(0..males.size-1)]
这样做:
males = couples.map(&:first)
current_male = males.sample
一种稍微简单一点的方法(假设至少有两对作为输入),它生成一个完整的新对集,然后测试原始对集中是否存在任何新对
def swingers(pairs)
while true
new_pairs = pairs.map(&:first).zip(pairs.map(&:last).shuffle)
return new_pairs unless new_pairs.any? { |pair| pairs.include? pair }
end
end
偶尔,最后一对夫妻会和原来的伙伴一起结束,因此循环会无休止地循环
有些方法可能会简化您的代码。请看一看。此外,您可能需要重新思考您的算法:循环直到适合它时
容易出现此类错误,并且您无法预测它将花费多少时间
假设您将雌性数组旋转随机数个位置(),并压缩两个列表以获得令人兴奋的新配对()。@meagar数组没有键
方法,您应该使用map
:coups.map{v|v[0]}.zip(coups.map{v|v[1]}.shuffle)
@mdesantis这已经是很久以前的问题了,重新加载页面太棒了!!非常感谢!我对编程相当陌生,我知道编码的一部分也要求你的代码可读,你的代码也会这样计算吗?我肯定会在一个参数和zip方法中研究符号的使用。我的代码,last示例,对于经验丰富的Ruby爱好者来说非常可读。感谢您的输入!我刚刚在Ruby的API上查找了转置方法,并在irb上进行了尝试,但它并没有真正返回我所期望的结果。我稍后将尝试进一步了解它。您会建议哪些最佳实践方法/循环,而不是使用“循环直到适合为止”?