【问题标题】:Ruby: Program I wrote in JavaScript not working the same way in RubyRuby:我用 JavaScript 编写的程序在 Ruby 中的工作方式不同
【发布时间】:2018-12-01 00:35:45
【问题描述】:

我最初是用 JavaScript 编写的,并在此处发帖寻求帮助(我得到了帮助)。然后我用 Ruby 编写了它,但它没有按预期工作。看起来代码在 Ruby 中几乎相同。

预期结果:29
实际结果:2639

prime = 0
temp = 0
factor = 3
i = 3
num = 13195

while factor < num
    if num % factor == 0
        while i < factor
            if factor % i == 0
                temp = prime
                break
            else
                temp = factor
            end
            i = i + 2
        end
        // i initializes back to 3 
        // so next factor can properly iterate through loop
        i = 3 
        prime = temp
    end
    factor = factor + 2
end
i = 3
puts prime

当我作为一个 JavaScript 程序提出这个问题时,这是答案的链接:
https://stackoverflow.com/a/50970934/7217977

【问题讨论】:

  • 这里有问题吗?
  • 是的,为什么我没有得到预期的结果?
  • 您是否尝试过逐步调试这两个程序并试图找到它们的输出开始分歧的地方?
  • Ruby 对我来说仍然是全新的,所以我只写我理解的语法,即使它不是最好的。随着我对这门语言越来越熟悉,我未来的代码会更好。
  • 是的。只需阅读大量 [好的] 代码并编写大量代码,您很快就会成为 ruby​​ 大师。比如,一两年。

标签: ruby loops primes prime-factoring


【解决方案1】:

在 Javascript 中,for (let i = 3; i &lt; factor; i += 2)i 初始化为 3,然后循环。但是在您的 Ruby 代码中,您在一开始只初始化一次 i,然后您的每个循环都在重用 i 的一个值,而不会将其重置回 3。

翻译那个for循环的Ruby方式是这样的

(3...factor).step(2) do |i|
  # loop code
end

这会创建一个块本地 i,它会在循环的每次迭代中重置,并且不会被外部作用域干扰。

【讨论】:

  • 我想我可能已经找到了解决办法,我在外部 while 循环结束之前将 i 设置回 3,我得到了预期的结果。我编辑了我的代码并在上面添加了关于这样做的评论。
猜你喜欢
  • 2020-11-06
  • 1970-01-01
  • 2015-04-30
  • 2010-09-08
  • 2014-05-31
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多