Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:试图理解为什么我的代码有时工作得很好,但有时却陷入循环_Ruby_Oop_Loops_Random_Multidimensional Array - Fatal编程技术网

Ruby:试图理解为什么我的代码有时工作得很好,但有时却陷入循环

Ruby:试图理解为什么我的代码有时工作得很好,但有时却陷入循环,ruby,oop,loops,random,multidimensional-array,Ruby,Oop,Loops,Random,Multidimensional Array,所以我正在为App Academy的训练营做额外的准备工作,其中一个示例问题是创建一个方法swingers,它接受一个夫妇数组的参数,并返回一个类似的数组,其中夫妇混合在一起 论点的格式是这样的:([[男,女],[男,女]…) 我的问题是,在执行代码的大部分时间,我都会收到正确的输出。 但是,有时代码不执行,并陷入循环(我假设) 我肯定我还没有写出最好的代码,也许我可以改变一些东西来阻止这个问题 这是我的密码: def swingers(couples) new_couples = []

所以我正在为App Academy的训练营做额外的准备工作,其中一个示例问题是创建一个方法swingers,它接受一个夫妇数组的参数,并返回一个类似的数组,其中夫妇混合在一起

论点的格式是这样的:([[男,女],[男,女]…)

我的问题是,在执行代码的大部分时间,我都会收到正确的输出。 但是,有时代码不执行,并陷入循环(我假设)

我肯定我还没有写出最好的代码,也许我可以改变一些东西来阻止这个问题

这是我的密码:

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上进行了尝试,但它并没有真正返回我所期望的结果。我稍后将尝试进一步了解它。您会建议哪些最佳实践方法/循环,而不是使用“循环直到适合为止”?