簡體   English   中英

遞歸函數 - 超出最大調用堆棧大小

[英]Recursive function - Maximum call stack size exceeded

嘿伙計們,

我對遞歸函數感到困惑,它達到了最大調用堆棧

const reversNumber = n => {
    return parseFloat( n.toString().split('').reverse().join('') );
};

const reversAddFunction = (n, count = 1) => {
    const sum = n + reversNumber(n);
    console.log(sum)

    if(sum === reversNumber(sum)){
        return [count, sum];
    } else {
        return reversAddFunction(sum, ++count);
    }
}
console.log(reversAddFunction(196));

任何建議如何編輯函數以得到相同的結果? 謝謝!

您使用 196 作為輸入的函數超過最大調用堆棧的原因是因為您的函數在到達答案之前被調用了太多次。 事實上,即使將您的函數轉換為循環以避免最大調用堆棧錯誤仍然不會為您的函數以 196 作為輸入產生答案。

請參閱以下內容:

const reverseNumber = n => {
  return Number(n.toString().split("").reverse().join(""));
};

const reverseAddLoop = n => {
  let currNum = n;
  let count = 1;

  while (true) {
    const sum = currNum + reverseNumber(currNum);

    if (Number.isNaN(sum)) {
      console.log(count, currNum);
      return [-1, -1]
    } else if (sum === reverseNumber(sum)) {
      return [count, sum];
    }

    currNum = sum;
    count += 1;
  }
}

console.log(reverseAddLoop(196))

在我的機器上, 1.000000505374505e+21是在總和變為NaN之前114876次迭代后最后計算的總和,但這已經是錯誤的,因為在 35 次迭代后,您的總和已經大於 Javascript 的最大整數值 (2^53 - 1) 所以基本上你可以丟棄你在這一點之后得到的任何東西。

在這種情況下, BigInt似乎特別有用,但即使使用BigInt我也無法在讓它運行 1 分鍾后以 196 作為輸入得到答案。 看:

const reverseBigInt = n => {
  return BigInt(n.toString().split("").reverse().join(""));
}

const reverseAddBigIntLoop = n => {
  let currNum = n;
  let count = 1;

  while (true) {
    const sum = currNum + reverseBigInt(currNum);

    if (sum === reverseBigInt(sum)) {
      return [count, sum];
    }

    currNum = sum;
    count += 1;
  }
}

console.log(reverseAddBigIntLoop(196n))

196 可能沒有答案,如果有,答案太大了,您無法計算。

暫無
暫無

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

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