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:未定義のローカル変数またはメソッド `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

あなたの試みのように、私はすべての引数を配列にキャプチャします。私は私のものと呼びます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 に答える