2

数週間前に階乗関数にsetTimeoutを使用することについて質問しましたが、残念ながら未登録のアカウントであり、完全な回答は得られませんでした。

私の主な問題は、数値の階乗を計算するが、setTimeoutまたはsetIntervalコマンドを使用する関数を作成したいということです。この背後にある推進力は、長時間実行されるスクリプトの警告を回避するために、IEが使用するカウンターをリセットすることです。現在、私が持っている階乗関数は次のとおりです。

function factorial(n) {
  return 0 === n || 1 === n ? 1 : n * factorial(n - 1)
}

私の他の投稿では、jsumnersは親切にも、階乗を計算するときにsetTimeoutを定期的に使用しようとするコードを提供してくれました。

function factorial(x) {
 executions++;
   if (x > 1) {
      if (executions % 20 === 0) {
          return (function() {
              var y = x;
              setTimeout(function(y) { return y*factorial(y-1); }, 1);
           });
      } else {
        return x*factorial(x-1);
      }
   } else {
  executions = 0;
      return 1;
   }
}

上記のコードでは、理論的にはsetTimeoutコマンドを使用して、経過した実行の数が20倍(mod 20)のときに次の乗算を実行する必要があります。残念ながら、コードは機能しません。20より大きい数値の階乗を計算しようとすると、結果はNaNになります。数が20未満の場合、答えは正解です。

setTimeoutまたはsetIntervalコマンドを使用して階乗を計算するこの方法または別の方法の解決策を知っている人はいますか?

ありがとう!

4

2 に答える 2

4

これは、渡されないために実行されたときyのパラメーターとして指定しているためです。これを変更することで修正できます。undefined

setTimeout(function(y) { return y*factorial(y-1); }, 1);

これに:

setTimeout(function() { return y*factorial(y-1); }, 1);

ただし、それでも次のNaN理由があります。

      return (function() {
          var y = x;
          setTimeout(function() { return y*factorial(y-1); }, 1);
       });

乗算できる数値ではなく、関数を返しているのでsetTimeout()、この方法でを使用することはできません。すべてが完了したときに実行されるコールバックを渡すことはできますが、このようなコールバックを繰り返して呼び出し元に戻すことはできません。

于 2010-10-26T00:16:53.227 に答える
0

setTimeoutでスケジュールされた各反復ステップのコールバックスタイル階乗は次のとおりです。

// private helper function (recurrency with accumulation)
function _factorial(acc, n, callback){
  if(n==0){
    callback(acc);
  }else{
    var callback_wrapper = function(result){
       callback(result);
    };
    setTimeout(function(){_factorial(acc * n, n-1, callback_wrapper)}, 10);
  }
}

// public function
function factorial(n, callback){
  _factorial(1, n, callback);
}

// usage example
factorial(10, function(result){console.log(result)});

-乾杯、ラムダー

http://lambder.com/

http://vanadiumJS.com/

于 2011-01-11T11:24:00.710 に答える