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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

2回答

921閲覧

再帰関数を変数に代入してそれをreturnする時の挙動が理解できない

melonattacker

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2020/04/11 06:41

わからないこと

以下のJSのプログラムを出力した時の結果が理解できません。
実際の出力結果は以下のようになりますが、なぜプログラムの「ここから」「ここまで」の部分が複数回繰り返されるのかがいまいちよくわかりません。

var x = 0; var y = 0; function rec() { x += 1 console.log(`x: ${x}`) if(x === 3) { return "hogehoge" } console.log("hugahuga") var result = rec(); // ここから console.log(result) y += 1; console.log(`y: ${y}`) // ここまで return result; } rec();
x: 1 hugahuga x: 2 hugahuga x: 3 hogehoge y: 1 hogehoge y: 2

以下のように、再帰関数を変数に代入せずにそのままreturnすると上のような繰り返しは起こりません。

var x = 0; var y = 0; function rec() { x += 1 console.log(`x: ${x}`) if(x === 3) { return "hogehoge" } console.log("hugahuga") return rec(); } rec();
x: 1 hugahuga x: 2 hugahuga x: 3

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

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

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

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

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

guest

回答2

0

ベストアンサー

挙動を追うのであれば、ステップ実行させてみるのが適当です。
この程度のコードであれば、ブラウザの開発ツールでも良いですが、以下でもわかりやすく表現できます。

http://pythontutor.com

投稿2020/04/11 06:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

こちらのサイトでコードの処理が追えるので参考にしてください。JavaScript Tutor

繰り返されているのは、

JavaScript

1var result = rec();

の行でrec()が呼び出されているからです。以下に、rec()の動作を記述します。

JavaScript

1x += 1 2console.log(`x: ${x}`)

console

1x: 1

JavaScript

1console.log("hugahuga") 2var result = rec();

console

1hugauga

ここでrec()が再帰されます。

JavaScript

1// 再帰されたrec()の内部挙動 2x += 1 3console.log(`x: ${x}`) 4console.log("hugahuga") 5var result = rec();

console

1x: 2 2hugahuga

さらに再帰の中でもう一度rec()が呼び出されます。ただし、if (x===3)にひっかかり、"hogehoge"がreturnされますので、そこで再起されたrec()の処理は終了します。

JavaScript

1// 再帰されたrec()の内部挙動(2回目) 2 x += 1 3 console.log(`x: ${x}`) 4 if(x === 3) { 5 return "hogehoge" 6 }

console

1x: 3 2hogehoge

そして再帰から抜けて、以下の行が実行されます。すでにx=3なのでif (x===3)にひっかかります。
(なぜここで10行目のconsole.log("hugahuga")がスキップされるのかは、私も分かりません。どなたか補足説明いただけると嬉しいです。)

JavaScript

1 var result = rec(); 2 // ここから 3 console.log(result) 4 y += 1; 5 console.log(`y: ${y}`) 6 // ここまで

console

1y: 1

最後の行でreturn result;となっているので、resultがもう一度呼び出されて再帰します。
(ここでもなぜ、13行目から処理が再開するのか私には分かりません。)

JavaScript

1 // ここから 2 console.log(result) 3 y += 1; 4 console.log(`y: ${y}`) 5 // ここまで

console

1hogehoge 2y: 2

どなたか補足で説明をよろしくお願いします。

投稿2020/04/11 07:38

junseinagao

総合スコア11

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

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

melonattacker

2020/04/11 07:53

`rec()`の呼び出しは(rec関数内・外を合わせて)3回ありますが、1、2回目は`var result = rec();`の行で一旦止められ、次の再帰に入ってしまいます。そして、3回目の呼び出しではrec関数は最後まで実行されます。その後に、止められていた1、2回目の実行が2回目、1回目の順で`var result = rec();`の行から再スタートするということだと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問