我有以下代码:
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/