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

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

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

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

Q&A

2回答

1032閲覧

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

hika2O21

総合スコア1

Ruby

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

0グッド

0クリップ

投稿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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

総合スコア19767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hika2O21

2022/01/10 07:59

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

0

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

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

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hika2O21

2022/01/10 07:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問