我有以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
我想知道如何迭代这个数组两次,结果是4*3*5 = 60,2*7*6 = 85,和4*3*4 = 48
我在上面编写了一些代码,我认为这样可以解决这个问题,但是Ruby一直在返回错误.
小智 5
需要考虑以下几点:
在Ruby中,你基本上不会使用for循环来迭代事物.#each更好.你可以通过一个街区,为你提供各种灵活性和表现力的空间.
此外,你不能 - 通常 - 迭代一个Integer.请记住,Integer是一个数值存储,而不是特定的表示,因此它必须依赖于您想要的表示的基础.如果你想要一串字符,每个字符恰好都是数字,那么猜猜是什么?你想要一个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
Run Code Online (Sandbox Code Playgroud)
这个小数字取一个基数和一个块,得到整数的绝对值(因为从技术上讲,减号不是一个数字),然后用divmod分割数字,砍掉最后一个数字.我们将这些碎片存放在前后.我们检查是否有更多的数字,由前面0表示,如果我们以递归方式调用此方法,则使用该块.然后我们只是屈服回来,将数字发送到块.
既然我们现在已经定义了一种each方法,那么现在我们可以自由选择包含Enumerable哪种方法!
只要该修改处于活动状态,您的product方法就变为:
(如果你想打印60 84 48): a.map {|n| n.reduce(:*)}
(或者如果你想打印241920): a.reduce(:*).reduce(:*)
挺棒的!
所以,这个完整的解决方案比seph的单线程要长一点,事实上如果我需要实际做一些我会做的事情to_s.我的解决方案执行速度更快吗?谁知道?但它肯定更具表现力,这就是你首先使用Ruby的原因.
如果你想解决一个问题,是的,绝对的,to_s.但是如果你希望你的代码能够表达一种关于数字的哲学,那么它们实际上也只是它们的集合 - 而且它们以一种奇怪的集理论方式,让你能够让它成为那样的.而这种根本不需要字符串的方式,他们完全没有勉强的帮助.并且你可以迭代不同的基础,如果你正在做十六进制或二进制,这是非常有用的,它保留了它们的更多数字本质.
在你和我一起建立的这个世界里,贾马尔,小整数与大男孩一起穿过森林.这太好了.