0

尝试编写经典的脑筋急转弯储物柜问题(打开/关闭 100 个储物柜的问题)。当我运行我编写的代码时,它并没有给出 10 个打开的储物柜的正确答案,而是说所有储物柜都已关闭。我想我在循环中遗漏了一些东西……有什么建议吗?谢谢。

 def lockerproblem
      j = 0
      lockers = []

      while j < 100
       lockers << "open"
       j += 1
      end 

       a = 1
       i = 0

       while a <= 100
       while i < 100
        if ( i + 1 ) % a == 0
          if lockers[i] == "open"
            lockers[i] = "closed"
          else
            lockers[i] = "open"
          end
        end
        i += 1
      end
      a += 1
    end

    lockers[3] = "open"

    lockers.each do |text|
      puts text
    end
  end

  lockerproblem
4

2 回答 2

0

您可以通过进行三个更改来获得正确的答案:

  • i需要在每次迭代开始时重置为 0a
  • 储物柜应该开始closed
  • 删除多余的lockers[3] = "open"

更新后的代码:

def lockerproblem
    j = 0
    lockers = []

    while j < 100
        lockers << "closed"
        j += 1
    end

    a = 1
    i = 0

    while a <= 100
        i = 0
        while i < 100
            if ( i + 1 ) % a == 0

              if lockers[i] == "open"

                lockers[i] = "closed"
              else

                lockers[i] = "open"
              end
            end
            i += 1
        end
        a += 1
    end

    lockers.each do |text|
        puts text
    end
end

lockerproblem
于 2013-04-02T21:07:14.017 回答
0

考虑这个数组初始化:

lockers = ["open"] * 100

想想你的i变量:什么时候设置为 0?这对内循环意味着什么?例如,

a, b = 0, 0
while a < 2
  while b < 2
    puts "a=#{a}, b=#{b}"
    b += 1
  end
  a += 1
end

输出:

a=0, b=0
a=0, b=1

换句话说,你不到:

a=0, b=0
a=0, b=1
a=1, b=0
a=1, b=1

为什么?因为b递增到2, 永远不会重置,内部循环只执行一次。也许您将初始值设置i在错误的位置,其中“错误”表示“在外循环之外”。

最后,打开第四个储物柜 ( locker[3]) 将抛出结果。

有一些小的调整可以使代码更容易理解(哎呀open?,为了这个小例子,我什至可以在 String 上定义一个方法),但这应该足以让你得到你期望的答案。


这种猴子补丁并不总是一个好主意,尤其是在 Ruby 内部。但它允许一些简单和漂亮的东西像这样:

> lockers.find_all(&:closed?).size
=> 10
于 2013-04-02T20:41:26.440 回答