ruby - 遍历数组内整数的数字

标签 ruby arrays loops

我有以下代码:

 a = [435,276,434]

 def product(a)
   final = 1
   for e in a
     for p in a[e]
       final*=p
     end
   end
   final
 end

 puts product(a)

我想知道如何迭代此数组两次,结果为 4*3*5 = 60、2*7*6 = 85 和 4*3*4 = 48

我在上面写了一些代码,我认为可以在这里解决问题,但 Ruby 一直返回错误。

最佳答案

需要考虑的几点:

在 Ruby 中,您基本上从不使用 for 循环来迭代事物。 #each 更好。您可以将一个 block 传递给它,这为您提供了各种灵 active 和表现力的空间。

此外,您不能 - 通常情况下 - 迭代 Integer。请记住,整数是数值的存储,而不是特定的表示形式,因此它必须取决于您想要的表示形式的基础。如果您想要一个 string 字符,每个字符恰好都是数字,那么,猜猜是什么?您需要一个 String,就像此处 seph 的解决方案一样。或者 Array,这可能更有意义,因为每个整数都将保持为整数并且不必来回解析。

告诉你吧,让我们构建一个非常酷的方法来执行此操作并将其装订到 Integer,并希望展示 Ruby 的一些很酷的功能。

class Integer
  include Enumerable
  def each(base = 10, &blk)
    front, back = abs.divmod(base)
    if front > 0
      front.each(base, &blk)
    end
    yield back
  end
end

这个小数字采用基数和 block ,获取整数的绝对值(因为从技术上讲减号不是数字),然后使用 divmod 拆分数字,砍掉最后一位。我们将零件存放在正面和背面。我们检查是否还有更多的数字,由 front 表示为 0,如果有,我们递归地调用这个方法,用那个 block 。然后我们就让步,将数字发送到 block 。

由于我们现在已经定义了一个 each 方法,我们现在可以自由地包含 Enumerable,这会给我们带来很多东西!

只要该修改处于事件状态,您的 product 方法就会变为:

(如果你想打印 60 84 48):a.map {|n| n.reduce(:*)}

(或者如果你想打印 241920):a.reduce(:*).reduce(:*)

很不错!

所以,这个完整的解决方案比 seph 的单行代码要长很多,事实上,如果我需要实际做某事,我会 to_s。我的解决方案执行起来更快吗?谁知道?不过,它肯定更具表现力,这就是您首先使用 Ruby 的原因。

如果你想解决一个问题,是的,绝对是,to_s。但是如果你想让你的代码表达你对数字的哲学,关于它们实际上也只是集合的哲学 - 而且它们是以一种奇怪的集合论的方式,Ruby 可以让你授权它们成为那样。通过这种方式,根本不需要 Strings,他们就完全摆脱了勉强的帮助。您可以遍历不同的基数,这在您处理十六进制或二进制时非常有用,它保留了它们更多的数字本质。

贾马尔,在这个你我共同 build 的世界里,小人物和大男孩们一起在森林中狂奔。这太棒了。

关于ruby - 遍历数组内整数的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19286767/

相关文章:

javascript - 如果索引大于 arr 长度,它应该再次返回

c - 如何将多维数组作为参数传递?

c - 在我的 C 程序中,为什么我的跟踪循环和实际输出不同?

loops - VBA Do Until 循环或 ""条件

ruby - 范围/线段树 Ruby

ruby-on-rails - Google Calendar API v3 - 更新事件

ruby-on-rails - #<ReportsController :0xde24d2c> 的未定义方法 `scope'

ruby-on-rails - 从 Fixnum 整数 Ruby on Rails 中获取每个单独的数字

c++ - 在 C++ 中,我的控制台游戏角色在游戏字段数组内向右移动时不会停止

java - 基于第一个值对所有值进行条件循环