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

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

ただいまの
回答率

90.76%

  • JavaScript

    15325questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 171

Behemoth

score 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  

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Behemoth

    2018/05/09 15:16

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

    キャンセル

  • mts10806

    2018/05/09 15:17

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

    キャンセル

  • Behemoth

    2018/05/09 15:18

    わかりました!

    キャンセル

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

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

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

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

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

function factorial (n) {
  if (n <= 0) return [];
  if (n === 1) return [0];
  if (n === 2) return [0, 1];
  var ary = factorial(n - 1);
  ary.push(ary[n - 2] + ary[n - 3]);
  return ary;
}
console.log(factorial(0)); // []
console.log(factorial(1)); // [0]
console.log(factorial(2)); // [0, 1]
console.log(factorial(3)); // [0, 1, 1]
console.log(factorial(4)); // [0, 1, 1, 2]
console.log(factorial(5)); // [0, 1, 1, 2, 3]
console.log(factorial(6)); // [0, 1, 1, 2, 3, 5]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 15:39

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    linux 処理時間の表示

    C言語でLinuxを使っています。メモリを確保したりするプログラムなのですが、以下のプログラムを修正して 、5秒間で何回の入れ替えを行えるかを計測できるようにしてもらいたいです。初

  • 解決済

    配列の並べ替えおよび後ろに送る方法

    前提・実現したいこと [1,2,3,4,5,6,7] という配列があったとして、これを任意の数を起点として並べ替え、それに満たない数は後ろに送った配列に並べ替えたいのです。

  • 解決済

    matplotlibで描く円グラフについて

    前提・実現したいこと matplotlibの持つ円グラフ描画メソッドpieで任意のカラーバリエーションで円グラフが描画出来るようにしたい 発生している問題・エラーメッセージ

  • 解決済

    double型の範囲について

    前提・実現したいこと 毎度お世話になっております。グラフで曲線を描きたいと思っております。 結果を格納する変数にdouble型を用いているのですが、途中から値がおかしくなります

  • 解決済

    MVC モデルのバリデーションについて

    モデルでアノテーション(Required)を指定しているプロパティが4つあります。 [Required] public string A { get; set;

  • 解決済

    [c]一つのデータでカラム数が変わるデータの読み込み

    質問失礼します。プログラム初心者です。 以下のような〜〜〜.datを fp1 = fopen(fname1,"r"); while((ret = fscanf(fp1,"%d %d

  • 解決済

    JavaScript関数呼び出し時に、関数内の変数名に付いた数値を任意に変更したい

    前提・実現したいこと 初歩的な質問となりますが、よろしくお願いいたします。 JavaScript(jQuery)で、関数の呼び出し時に、その関数の中にある変数名の数値を指定できれば

  • 受付中

    call/cc, lambdaについて

    授業でLisp, Schemeについて軽く触れる必要があった者です。 普段はPython, Cくらいしか使いません。紹介程度に扱われたのであまり深く首を突っ込みたくありません(わが

同じタグがついた質問を見る

  • JavaScript

    15325questions

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