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

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

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

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

Q&A

解決済

3回答

5279閲覧

最大公約数を求めるプログラム わからない部分があります

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2016/07/17 06:08

最大公約数を求めるプログラムなのですが、最後の行にあるgcd(gets.chop
がわかりません。検索したのですが、出てこなくて、もやもやしています。

あと、chopは、末尾から一文字を取り除いたものを返すみたいですが、ここでchopを付けるというのは、何のためにしているのでしょうか? \nを取り除くですか?

def gcd(x, y)
return y if x % y == 0
gcd(y, x % y)
end

puts gcd(*gets.chop.split.map(&:to_i))


最後の行は、
puts gcd(gets.split.map(&:to_i)
でも、一応動くようですが、だとしたら、*とchopは何のために付いているのでしょうか?

教えてください。

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

getsは1行入力(例:"10 20\n")、chopは末尾の文字を削除(chompは末尾が改行文字であれば削除、改行文字でなければそのまま、と少し違う)(例:"10 20")、splitは引数が無い場合「先頭と末尾の空白を除いたうえで、空白文字列で分割する」(例:["10","20"])、map(&:to_i)で文字列を数値に変換(例:[10,20])、*はArrayを複数の値に分割(例:10,20)。

なので、この場合はchopは合ってもなくても同じです。chopしない場合は改行文字は次のsplitで取り除かれるので。

*を付けないと、gcd([10,20])と呼び出します。*を付けると、gcd(10,20)と呼び出します。
gcdは、引数を2つ指定する必要があるので、*を付けないと引数個数不一致のエラーになります。
*を付けなくても同じだったというのは勘違いでしょう。

投稿2016/07/17 11:44

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2016/07/17 23:40

回答ありがとうございます。 gcdに*を付けると、gcd(10,20)になるのですね。 gcd([10,20])ってどういう意味ですか? 配列なのはわかりますが…二次元配列ですか?
otn

2016/07/18 00:06 編集

> gcdに*を付けると、gcd(10,20)になるのですね。 gcdに*を付けるんじゃなくて、gets.chop.split.map(&:to_i) に*を付けるんです。 > gcd([10,20])ってどういう意味ですか? gcdを呼び出すときに[10,20]というただ一つの引数を渡すと言うことです。 受け取る側のメソッド定義での引数も1つでないといけない。 実際には引数2つで定義されているのでエラーになります。 「メソッド」とか「メソッド呼び出し」を理解していますか?
退会済みユーザー

退会済みユーザー

2016/07/18 04:23

ありがとうございます。 メソッドは多分理解していると思います。Javaでいうmainメソッドとかのことですよね。 ですが、メソッド呼び出しは自信がないですね。def rectangle()みたいなのをメソッドで呼び出すみたいな感じだと思っています。
guest

0

ruby での記号の意味についてはこんなページがあります。

* については、こんな説明があります。

...
2 * 3
かけ算。または類似の演算を行うメソッド。

2**3
累乗。または類似の演算を行うメソッド。

def xxx(*yy) ・・ *がついた引数
メソッド呼出の引数展開。メソッド呼び出し(super・ブロック付き・yield) と クラス/メソッドの定義/メソッド定義 を参照。

x, *y = foo()
多重代入。演算子式/多重代入 を参照。

/xx*/
正規表現の、直前の表現の 0 回以上の繰り返し。できるだけ長くマッチしようとする。 正規表現 を参照。
...

投稿2016/07/17 10:55

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2016/07/17 23:46

回答ありがとうございます。 3つ目のdef xxx(*yy)がこの場合ですね。 リファレンスも見てみましたが、引数展開がよくわからないです。参照も見てみたのですが、???でした。
guest

0

自分で書いてる通り、getsでは文字列だけでなく改行コード「\n」も含んで取り込んでしまうのでgets.chompで取り除きます。

呼び出し側のアスタリスクは配列を展開という意味です。
gets.chop.split.map(&:to_i)が配列([x,y])を返すので、*をつけて展開(x, y)してgcdの引数として渡してます。

ruby使ったことないですが、「ruby gets アスタリスク」で検索してみました。

投稿2016/07/17 06:36

lightwill

総合スコア962

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

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

退会済みユーザー

退会済みユーザー

2016/07/17 08:23

ruby回答ありがとうございます。 chompではなく、chopなのですが、同じように、改行コードが取り除かれているのでしょうか? ruby gets アスタリスクで検索してみます。
退会済みユーザー

退会済みユーザー

2016/07/17 08:26

すみません。書いていたら、誤って、コメントしてしまいました。 rubyを使ったことがないのに、調べてくださって、ありがとうございました。 アスタリスクはgetsに付属するアスタリスクなんですね。勉強になりました。 まだ、よくわからない部分があるので、「ruby gets アスタリスク」で検索してみます。
退会済みユーザー

退会済みユーザー

2016/07/17 09:07

度々、すみません。一点わからない部分があるのですが、 「配列([x,y])を返すので、*をつけて展開(x, y)してgcdの引数として渡してます。」 の、配列を?展開とは どういうことでしょうか? 検索してみたのですが、見たサイトもやはり展開と書かれているのですが、よくわからないのですが…どういう状態をいうのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問