質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

受付中

整数を要素とする2次元配列が与えられたとき,その要素をすべて足し合わせた結果を出力するメソッドを作成したい。

hika2O21
hika2O21

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

2回答

0グッド

0クリップ

623閲覧

投稿2022/01/10 03:16

前提・実現したいこと

rubyで整数を要素とする2次元配列 mat が与えられたとき,その要素をすべて足し合わせた結果を出力するメソッドsum(mat)を作成したいのですが、配列をしたのように設定したらエラーが起きました。どこがダメなのかご教授ください。

発生している問題・エラーメッセージ

sum [[1, 3, 5, 7]] TypeError: Array can't be coerced into Fixnum

該当のソースコード

def sum(mat) max = 0 aaa(mat).each_index do |i| max += aaa(mat)[i] end end def aaa(arr) if arr.size == 1 arr elsif arr.size == 2 bbb(arr[0],arr[1]) else bbb(arr[0], aaa(arr[1..-1])) end end def bbb(arr1,arr2) ret = Array.new(arr1.size, 0) arr1.size.times{|n| ret[n] += arr1[n] + arr2[n]} ret end

試したこと

irb> sum [[1, 2], [3, 4]]
=> 10
irb> sum [[-1, 0, 1], [-2, 0, 1]]
=> -1

上のような配列を試したところ正常に計算してくれました。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

aaa() 関数に puts を入れてみると判るかと思いますが、入力が [[1, 3, 5, 7]] の場合は配列のサイズが 1 ですので、そのままの値で戻される事になります。そして、max += aaa(mat)[i]aaa(mat)[i]max += [1, 3, 5, 7] になるので当該のエラーが発生することになります。

ruby

1def sum(mat) 2 max = 0 3 aaa(mat).each_index do |i| 4 max += aaa(mat)[i] 5 end 6 return max 7end 8 9def aaa(arr) 10 puts "aaa(arr) = #{arr} #{arr.size}" 11 if arr.size == 1 12 arr 13 : 14 15p sum [[1, 3, 5, 7]] 16 17# 18aaa(arr) = [[1, 3, 5, 7]] 1 19aaa(arr) = [[1, 3, 5, 7]] 1 20 : 21

まぁ、以下の様にしても良いかな、とは思います。

ruby

1def sum(mat) 2 return mat.flatten.sum 3end

投稿2022/01/10 06:44

melian

総合スコア17129

hika2O21👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hika2O21

2022/01/10 07:59

質問に丁寧に答えて下さり、ありがとうございます。 これからの勉強の参考させていただきます。

1

以下のようにしてください。

ruby

1def sum(mat) 2 max = 0 3 aaa(mat).each_index do |i| 4 max += aaa(mat)[i] 5 end 6 max 7end 8 9def aaa(arr) 10 if arr.size == 1 11 arr[0] 12 elsif arr.size == 2 13 bbb(arr[0],arr[1]) 14 else 15 bbb(arr[0], aaa(arr[1..-1])) 16 end 17end 18 19 20def bbb(arr1,arr2) 21 ret = Array.new(arr1.size, 0) 22 arr1.size.times{|n| ret[n] += arr1[n] + arr2[n]} 23 ret 24end 25p sum [[1, 3, 5, 7]]

実行結果
16

投稿2022/01/10 06:36

tatsu99

総合スコア4996

hika2O21👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hika2O21

2022/01/10 07:58

質問に答えて下さり、ありがとうございます! まだまだ未熟なところが多いので、参考にさせていただきます。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。