2

我试图将任意数量的未知参数相乘以求总和。

 def multiply(*num)
  num.each { |i| puts num * num}
  end

multiply(2,3,4)
multiply(2,3,4,5,6,7)

另一种尝试:

def multiply(num)
  num.to_i
   i = 0
   while i < num.length
   total = num * num

    return total
   end
end

multiply(2,3,4)
multiply(2,3,4,5,6,7)

我一直遇到错误:(eval):73: undefined local variable or method `num_' for main:Object (NameError) from (eval):81

有人说数组需要是整数。

我已经尝试过做一些我认为应该是非常简单的程序来编写的事情。

4

3 回答 3

8

def multiply(*num)捕获给定数组中的方法的所有参数。如果你跑multiply(1, 2, 3, 4)那么num将等于[1, 2, 3, 4]。因此,在您的两次尝试中,您都试图将整个数组与其自身 ( num * num) 相乘,但这是行不通的。

其他人已经提出了如何正确编写乘法方法的解决方案,但让我给你一个你第一次尝试的正确版本并正确解释:

def multiply(*numbers)
  result = 1
  numbers.each { |n| result = result * n }
  result
end

在您的尝试中,我将所有参数捕获在一个数组中,我称之为 mine numbers。然后我声明一个变量来保存所有乘法的结果。给它的值1很方便,因为它不会影响乘法,但我也可以将第一个值移出numbers数组,还有其他解决方案。

然后我用 遍历所有数字each,并且对于每个数字,我将它与当前结果相乘并将其存储为新结果(我可以用 更短地编写它result *= n)。

最后我返回结果(方法的最后一个值是该方法将返回的值)。

有更短的方法可以做同样的事情,其他人建议使用numbers.reduce { |n, result| n * result },甚至numbers.reduce(:*),但即使它们更短,它们也很神秘,我认为它们并不能真正帮助你让事情正常进行。

于 2013-02-23T20:09:56.217 回答
2

你想要的是#inject 方法

def multiple(*nums)
  nums.inject(:*)
end

Inject 将使用指定的操作(在本例中为 *)组合 nums 中的所有元素。

于 2013-02-23T22:59:14.247 回答
0

你可以试试这个:

num.reduce(1) {|x, y| x*y }
于 2013-02-23T19:52:48.653 回答