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

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

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

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

Q&A

解決済

2回答

2241閲覧

Rubyの再帰関数について

sachatete

総合スコア18

Ruby

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

0グッド

0クリップ

投稿2018/09/13 13:32

前提・実現したいこと

こんばんは。
以下のkaijoメソッドの戻り値が6になる理由はなぜでしょうか?
return 1 if num.zero?でメソッドが終了してreturnの引数である1が返ると思ったのですが、再帰関数ではなぜ6が戻り値となるのでしょうか?

該当のソースコード

Ruby

1def kaijo(num) 2 return 1 if num.zero? 3 num * kaijo(num - 1) 4end 5p kaijo(3) 6#=> 6

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

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

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

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

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

guest

回答2

0

ベストアンサー

kaijo(0)であれば、return 1で1が返ります。

kaijo(3)であれば、1行目の条件3.zero?は偽なので、次の3 * kaijo(2)が返り値となります。
kaijo(2)は、2 * kaijo(1)が返り値で、kaijo(1)は、1 * kaijo(0) つまり1 * 1が返ります。

plain

1kaijo(3) = 3 * kaijo(2) = 3 * 2 * kaijo(1) 2= 3 * 2 * 1 * kaijo(0) = 3 * 2 * 1 * 1 = 6

投稿2018/09/13 13:40

otn

総合スコア84555

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

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

sachatete

2018/09/13 13:58

頭の中で3 * kaijo(2) -> 3 * 2 * kaijo(1)...のように展開できていませんでした。returnはkaijo(0)で0を返さないためにあるのですね。 スッキリしました、ありがとうございます。
guest

0

Rubyもそうですが、多くの言語では再帰呼び出しをしても、引数やローカル変数などは別個に存在します

なので、kaijo(3)を実行した場合、returnifの条件を満たさないため戻らず、次のnum * kaijo(num - 1)、つまり3 * kaijo(2)が返り値となります。

投稿2018/09/13 13:38

maisumakun

総合スコア145184

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

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

sachatete

2018/09/13 13:59

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問