簡體   English   中英

如何使用setTimeout或setInterval在Javascript中編寫階乘函數

[英]How to write a factorial function in Javascript using setTimeout or setInterval

幾周前,我問了一個關於使用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;
   }
}

在上面的代碼中,當經過的執行次數是20的因數(模數20)時,理論上應該使用setTimeout命令執行下一個乘法。 不幸的是,該代碼無法正常工作,發生的事情是,如果嘗試計算大於20的數字的階乘,則結果為NaN。 如果數字小於20,則答案是正確的。

有人知道使用setTimeout或setInterval命令來計算階乘的這種方法或其他方法的解決方案嗎?

謝謝!

這是因為您將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() 您可以傳遞在完成所有操作后執行的回調,但是您不能讓它遞歸並返回到這樣的調用方。

通過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)});

-干杯,Lambder

http://lambder.com/

http://vanadiumJS.com/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM