while改递归 Uncaught RangeError: Maximum call stack size exceeded

问题描述

while方法 数据多大都能通过。
但是改成递归 执行数据特别大的时候会报错:
例如:lastRemaining(70866,116922) 会报》》 Uncaught RangeError: Maximum call stack size exceeded

请问是因为数据大 导致递归超过了最大堆栈量(堆栈溢出) ,还是递归的时候哪写错了

//while方法代码
var lastRemaining = function(n, m) {
    let arr = [];
    for (let i=0;i<n;i++){arr.push(i)}

    let start = 0;//开始位置
    while (arr.length > 1) {
        start = (start + m - 1) % arr.length;
        arr.splice(start, 1); // 删除元素
    }
    return arr[0];
};

//递归方法代码  
var lastRemaining = function(n, m) {
    let arr = [];
    for (let i=0;i<n;i++){arr.push(i)}

    let start = 0;//开始位置
    (function delete_fn(){
        if(arr.length > 1){
            start = (start + m - 1) % arr.length;
            arr.splice(start, 1); // 删除元素
            delete_fn();
        }
    })()
    return arr[0];
};
阅读 2.1k
1 个回答

用递归时会遇到栈溢出的问题,所以递归并不是万能药水,避免栈溢出的问题,就可以使用while循环。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题