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

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

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

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

Q&A

解決済

2回答

346閲覧

再帰関数について、疑問点

Behemoth

総合スコア29

JavaScript

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

0グッド

0クリップ

投稿2018/05/09 06:01

編集2018/05/09 06:21

再帰関数でフィボナッチ数を生成するコードについてです。

function fibonacci(num) { if (num <= 1) return 1; return fibonacci(num - 1) + fibonacci(num - 2); }

たとえば5を引数に取った場合、
fibonacci(1)//return 1
fibonacci(2)
fibonacci(3)
fibonacci(4)
fibonacci(5)
のようにスタックされていくと思います。

fibonacci(1)の時に1が返されると思うのですが、その次からの挙動がよくわかりません。

どなたか解説をお願いしますm(__)m

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

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

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

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

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

m.ts10806

2018/05/09 06:03

挙動がわからない、とは?具体的に「課題」「疑問」「起きている現象」を記載してください。
Behemoth

2018/05/09 06:09

修正いたしました。m(__)m
m.ts10806

2018/05/09 06:14

コードが当初と随分変わってしまっています。「意図的に内容が抹消された質問」として非推奨です。要件から見直したほうが良いでしょう。 Number(1) など今まで出てこなかった情報がいきなり出てきています。
Behemoth

2018/05/09 06:16

すみません 最初の質問は自己解決しまして、「自己解決方法を記入する」を選ぶべきでした。
Behemoth

2018/05/09 06:16

すみません 最初の質問は自己解決しまして、「自己解決方法を記入する」を選ぶべきでした。
m.ts10806

2018/05/09 06:17

では編集履歴より最初の状態に戻し、自身で回答を書き、自己解決とした後に新しい質問を経てると良いでしょう。
Behemoth

2018/05/09 06:18

わかりました!
guest

回答2

0

エラーの原因が分かりました。

JavaScript

1function factorial(n){ 2 if(n == 2){ 3 // つまり、nが2の時だけary変数が宣言される 4 var ary = [0,1]; 5 return ary; 6 }else{ 7 // 宣言されてないary変数を呼び出そうとしている 8 return factorial(n - 1).push(ary[n - 1] + ary[n - 2]); 9 } 10}

実際にコードを手直しして動かしましたが、もう少しで動く惜しい所まで来ています。

そして頑張っているようなのでアドバイスだけ。
このコードは再帰関数を表現しようとしたコードのようですね。

  • n = 1の時に無限ループで落ちますので、(n <= 2)のような対策をオススメします。
  • aryがないのでvar ary = factorial(n - 1)で用意しておく
  • Array.pushの戻り値は配列の長さの数値になるので、今回は直接返せない。
  • 配列の添字は0スタートだけどary[n - 1]は存在する?存在しない?

これらを解決すれば完成するので頑張ってみてください。

JavaScript

1// array.pushの戻り値を確認しておく 2console.log([0, 1, 1].push(2)); // 4

あら、コードが変わっちゃいましたね。
では配列を返す版の回答を載せておきます。

JavaScript

1function factorial (n) { 2 if (n <= 0) return []; 3 if (n === 1) return [0]; 4 if (n === 2) return [0, 1]; 5 var ary = factorial(n - 1); 6 ary.push(ary[n - 2] + ary[n - 3]); 7 return ary; 8} 9console.log(factorial(0)); // [] 10console.log(factorial(1)); // [0] 11console.log(factorial(2)); // [0, 1] 12console.log(factorial(3)); // [0, 1, 1] 13console.log(factorial(4)); // [0, 1, 1, 2] 14console.log(factorial(5)); // [0, 1, 1, 2, 3] 15console.log(factorial(6)); // [0, 1, 1, 2, 3, 5]

投稿2018/05/09 06:32

編集2018/05/09 06:37
miyabi-sun

総合スコア21158

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

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

Behemoth

2018/05/09 06:39

ご回答・ご解説ありがとうございます! 質問内容が二転三転してしまい申し訳ありません。 初めは回答をみずに、はじめに頂いたヒントをもとに自分で考えてみたいと思います!
guest

0

自己解決

たとえばfibonacci(2)のときに
finbonacci(1) //1
が適用でき、つながるのですね。

投稿2018/05/09 06:22

Behemoth

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問