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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

476閲覧

フィボナッチ数のコードの解釈について

mingo09

総合スコア23

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/06/16 12:56

1 行目に整数 N が与えられます。
N 番目までのフィボナッチ数を出力してください。

フィボナッチ数は

F_0 = 0 F_1 = 1 F_(n+2) = F_n + F_(n+1) (n は 0 以上)

とし、F_0 を 1 番目とします。

  • N は 3 以上 10 以下の整数

入力例1

3

出力例1

0 1 1

【調べて書いたコード】

Ruby

1n = gets.to_i 2 a, b = 0, 1 3 puts a 4 (n-1).times do 5 a, 6 b = b, 7 a + b 8 puts a 9 end

出力結果

0 1 1

【困っていること】
フィボナッチ数の実装 こちらの記事にある、n.times { a, b = b, a + b }というコードは次のコードと同じと考えて問題ないでしょうか。
問題あればご指摘いただきたいです、お願いいたします。

Ruby

1 n.times do 2 a, 3 b = b, 4 a + b 5 puts a 6 end

Ruby

1a, b = 0, 1 2 puts a 3 (n-1).times do 4 a, 5 b = b, 6 a + b 7 puts a 8end

このコードの解釈についてです。timesメソッドのまえで、a, b = 0, 1と初期値を代入しています。
したがって、timesメソッドの中で、a, b=b, a+bの値は次のようになっていると思います。

Ruby

1a = 0 2b = 1 3a + b = 1 4puts a #=> 0

これを何度timesメソッドで繰り返したところで、a = 1のままなのではないかと思うのですが、実際はそうなっていません。どこの解釈に問題があるでしょうか。
ご教授いただけたら嬉しいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー


Pythonと違って、Rubyはインデントや改行がでたらめでも多くの場合動きますが(改行がでたらめだと動かないケースも)、インデントや改行をちゃんと書く習慣を付けた方が良いです。
お書きのコードは、puts aの有無以外同じです。改行をちゃんと書くと、一目瞭然。

timesメソッドの中で、a, b=b, a+bの値は次のようになっていると思います。

どういう理由でそう思うのか全く不明ですが、もちろん間違っています。
a, b = 0, 1の状態でa, b=b, a+bを実行すると、bが1でa+b1なので、a, b = 1, 1となるのは一目瞭然。その状態で再度a, b=b, a+bを実行すると、bが1でa+b2なので、a, b = 1, 2となる。

もしかすると、「右辺を全部評価してから左辺に代入する」ということが理解できていないのでしょうか?
(「評価」とは「変数からその値を取り出して計算する」ような意味です)
つまり、=の右辺をその時点の変数の値の数値で全部置き換えて、計算してから、左辺の変数に一気に代入します。

投稿2022/06/16 13:14

編集2022/06/16 13:17
otn

総合スコア84538

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

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

mingo09

2022/06/16 14:22 編集

丁寧に解説していただきありがとうございます。 { a, b = b, a + b }この部分を次のように分けて見てしまっていました。 a/b = b / a+b で分けて、そこに初期値を代入するといった見方をしてしまってました。 { a, b = b, a + b }このコードを区別してかくと次のようになっていることに、otnさまのおかげで気づくことができました。 a(左辺) = b(右辺) b(左辺) = a+b(右辺) この左辺に最初は初期値が入るため、a, b = 1, 1となるわけですね。 ご指摘ありがとうございました。
otn

2022/06/16 14:52

あれ? a, b = 0, 1 の意味は理解していると思ったのですが、理解してなかったということだったのでしょうか? a, b = 0, 1 でaに0がbに1が代入されると理解できれば a, b = b, a + b も同じ形式なのですが。
guest

0

カンマの解釈が間違っています。

多重代入 を参照してください。

投稿2022/06/16 13:05

arcxor

総合スコア2859

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

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

mingo09

2022/06/16 14:23

ご回答いただきありがとうございます。 カンマの解釈が間違っていました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問