首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智囊团锁柜是开着的还是关着的?在Ruby中

智囊团锁柜是开着的还是关着的?在Ruby中
EN

Stack Overflow用户
提问于 2013-04-03 04:27:25
回答 2查看 477关注 0票数 0

尝试编写经典的脑筋急转弯储物柜问题(打开/关闭100个储物柜)。当我运行我写的代码时,它没有给出10个打开的储物柜的正确答案,而是显示所有储物柜都是关闭的。我想我在我的loops...any建议中遗漏了什么?谢谢。

代码语言:javascript
复制
 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
EN

回答 2

Stack Overflow用户

发布于 2013-04-03 04:41:26

对于数组初始化,请考虑以下内容:

代码语言:javascript
复制
lockers = ["open"] * 100

考虑一下您的i变量:它什么时候设置为0?这对内部循环意味着什么?例如,

代码语言:javascript
复制
a, b = 0, 0
while a < 2
  while b < 2
    puts "a=#{a}, b=#{b}"
    b += 1
  end
  a += 1
end

输出:

代码语言:javascript
复制
a=0, b=0
a=0, b=1

换句话说,你看不到:

代码语言:javascript
复制
a=0, b=0
a=0, b=1
a=1, b=0
a=1, b=1

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

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

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

这样的补丁并不总是一个好主意,特别是在Ruby内部。但是它允许一些简单和漂亮的东西,比如:

代码语言:javascript
复制
> lockers.find_all(&:closed?).size
=> 10
票数 0
EN

Stack Overflow用户

发布于 2013-04-03 05:07:14

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

  • i需要在每次迭代开始时重置为0 a
  • The锁应作为closed
  • Remove lockers[3] = "open" lockers[3] = "open"

启动

更新后的代码:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15773729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档