我正在嘗試通過遞回解決 leetcode 的問題,但我收到一個錯誤,說RangeError: Maximum call stack size exceeded我可能做錯了什么。
問題:
撰寫一個演算法來確定一個數字 n 是否快樂。
快樂數字是由以下程序定義的數字:
從任何正整數開始,將數字替換為其數字的平方和。
重復這個程序,直到數字等于 1(它將保持不變),或者它在一個不包括 1 的回圈中無限回圈。這個程序以 1 結束的那些數字是快樂的。
n如果是一個快樂的數字,則回傳 true ,false如果不是。
Example 1:
Input: n = 19
Output: true
Explanation:
12 92 = 82
82 22 = 68
62 82 = 100
12 02 02 = 1
Example 2:
Input: n = 2
Output: false
我的代碼:
var isHappy = function(n) {
if(n.length<2) return false
var fn=(n)=>{
let i=0;
let sum=0;
while(i<n.length){
sum=sum Math.pow(n[n.length-1-i],2);
i ;
}
while(sum!==1){
//console.log(sum)
fn(sum);
}
if(sum === 1) return true
}
fn(n)
};
PS:我不需要這個問題的解決方案。我想找出為什么我的代碼不起作用以及我做錯了什么。而且,我應該做些什么改變才能正常作業。
鏈接到上述問題。
uj5u.com熱心網友回復:
正如您自己寫的那樣,“重復該程序,直到數字等于 1(它將保持不變),或者它在一個回圈中無限回圈”。
在您的實作中,fn無限呼叫自身。在這個程序中,javascript 虛擬機在每次迭代時在記憶體中創建一個函式背景關系。這可以在Maximum call stack size exceeded拋出錯誤之后的特定時間完成。
我做錯了什么?
當你找到一個滿意的數字時,你回傳 true,否則你永遠不會回傳 false。添加一個條件來檢測不愉快的數字(檢測一個回圈)并在這種情況下回傳 false。
編輯:這是一個示例實作:
var isHappy = function(n) {
if(n.length<2) return false
// placeholder to store already called values
const calledValues= new Set()
var fn=(n)=>{
let i=0;
let sum=0;
if (calledValues.has(n))
// cycle detected!
return false;
calledValues.add(n);
while(i<n.length){
sum=sum Math.pow(n[n.length-1-i],2);
i ;
}
if (sum !== 1)
return fn(sum.toString());
else
// sum === 1, number is happy!
return true
}
// make sure to pass a string to fn
return fn(n.toString());
};
(new Array(20)).fill().map((_,i)=>10 i)
.forEach(n=> console.log(n, "is happy?", isHappy(n)));
uj5u.com熱心網友回復:
Maximum call stack size exceeded
當函式呼叫其他函式次數過多時會發生此錯誤。在這種情況下,如果數字是“不愉快”的數字,您的函式會無限遞回地呼叫自身。
考慮在你的函式中添加一些東西,讓你知道行程是否無限回圈。
考慮使用引數/陣列來存盤已經出現的數字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461005.html
標籤:javascript 递归 while循环 动态规划 调用栈
下一篇:如何遞回復制陣列
