web-dev-qa-db-ja.com

再帰関数の戻り値を変数JavaScriptに保存する方法

戻り値を変数に格納する必要があります。

このコードを修正する方法を知りたいです。 bの値が3の場合、value = 2になることはわかっていますが、関数が複数の反復を実行すると、識別できなくなります。コールバックなどを使用する必要があることを読みましたが、方法がわかりません。また、コードが機能しない理由と修正方法についても説明します。 (もちろん、このコードは、元のコードを表示すると混乱する可能性があるかのように、デモンストレーションを目的としています。)どうもありがとうございました!

var b = 70;

function myfunction() {
    b--;
    if (b < 3) {
        return b;
    } else {
        myfunction();
    }
}
value = myfunction();
console.log(value);
7
Wasea

あなたのコード:myFunction()は最初の呼び出しでvoid/undefinedを返します。これは再帰的なアプローチではありません。

次の例は再帰的アプローチです。再帰関数は通常、処理される引数を受け取り、最初の呼び出し元までバブル(返された)最終値を返します。

function myfunction(b){
  b--;
  if(b<3) return b;
  else return myFunction(b);
}

再帰関数を呼び出すときは、エスケープのテストを準備する必要があります。そうしないと、無限ループに陥る可能性があります。

無限再帰の例

function badFunction(){
return badFunction();
}
// DON'T call badFunction()

再帰的な例

var b = 70;
var safety = 1000;

function myfunction(local_b) {
  if(safety<0) return;
  safety--;

  // main task
  local_b--;
  
  if (local_b < 3) {
    return local_b;
  }

  return myfunction(local_b);

}
var value = myfunction(b); // when b = 70, value = 2
console.log(value);
document.getElementById('value').innerHTML = value;
<span id="value">_</span>
4
Nik