簡體   English   中英

未捕獲的 RangeError:p5.js 中超出了最大調用堆棧大小

[英]Uncaught RangeError: Maximum call stack size exceeded in p5.js

我正在嘗試在 p5.js 中運行合並排序算法,但function mergesort(arr, start, end)拋出錯誤(超出最大調用堆棧大小)。 output 應該是在瀏覽器 window 上顯示為行的排序數組。

這是我的代碼:

var values = []

function setup(){
    createCanvas(600,400);
    values.length = width;
    for(let i=0; i<values.length; i++){
        values[i] = random(height);
    }
    mergesort(values, 0, values.length-1)
}

function draw(){
    background(0);
    for (let i=0; i< values.length; i++){
        stroke(255,0,255);
        line(i, height, i, height - values[i]);
    }
}

function mergesort(arr, start, end){
    if(arr.length <= 1)
        return;

    let middle =arr.length/2

    mergesort(arr, start, middle);
    mergesort(arr, middle +1, end);
    merge(arr, start, middle, end);
}
function merge(arr, start, middle, end){
    let sizeL = middle - start;
    let sizeR = middle - end;
    let arrL = [];
    let arrR = [];
    for (let i = start; i < sizeL; i++) 
        arrL.push(arr[i])
    for (let j = sizeR; j < end; j++) 
        arrR.push(arr[j])
    let a = 0; 
    let b = 0;
    let k = 1;
    while (a< sizeL && b < sizeR){
        if (arrL[i] <= arrR[b]){
            arr[k] = arrL[a]; 
            a++; 
        } 
        else{
            arr[k] = arrR[b]; 
            b++; 
        } 
        k++; 
    } 
    while (a < sizeL){ 
        arr[k] = arrL[b]; 
        a++; 
        k++; 
    } 
    while (b < sizeR) { 
        arr[k] = arrR[b]; 
        b++; 
        k++; 
    }
}

請糾正錯誤

數組的長度永遠不會改變,因此條件if(arr.length <= 1)永遠不會終止並且let middle = arr.length/2的結果總是相同的。

您必須評估end - start <= 1並通過(start + end)/2計算middel

function mergesort(arr, start, end){
    if(end - start <= 0)
        return;

    let middle = Math.floor((start + end)/2);

    mergesort(arr, start, middle);
    mergesort(arr, middle+1, end);
    merge(arr, start, middle, end);
}

此外還有一些索引問題。 請注意,在merge中, arguments startmiddleend是索引。 因此 arrays 的長度分別為middle - start + 1 end - middle 而且您必須將排序后的元素從start ,因此k = start

function merge(arr, start, middle, end){
    let sizeL = middle - start + 1;
    let arrL = [];
    for (let i = start; i < middle+1; i++) 
        arrL.push(arr[i])

    let sizeR = end - middle;
    let arrR = [];
    for (let j = middle+1; j < end+1; j++) 
        arrR.push(arr[j])

    let a = 0, b = 0, k = start;

    // [...]
}

可以使用Array slice()方法簡化代碼:

let arrL = arr.slice(start, middle+1);
let arrR = arr.slice(middle+1, end+1);

看例子:

 var values = [] function setup(){ createCanvas(600,400); values.length = width; for(let i=0; i<values.length; i++){ values[i] = random(height); } mergesort(values, 0, values.length-1) } function draw(){ background(0); for (let i=0; i< values.length; i++){ stroke(255,0,255); line(i, height, i, height - values[i]); } } function mergesort(arr, start, end){ if(end - start <= 0) return; let middle = Math.floor((start + end)/2); mergesort(arr, start, middle); mergesort(arr, middle+1, end); merge(arr, start, middle, end); } function merge(arr, start, middle, end){ let sizeL = middle - start + 1; let arrL = arr.slice(start, middle+1); let sizeR = end - middle; let arrR = arr.slice(middle+1, end+1); let a = 0, b = 0, k = start; while (a< sizeL && b < sizeR){ if (arrL[a] <= arrR[b]){ arr[k++] = arrL[a++]; } else{ arr[k++] = arrR[b++]; } } while (a < sizeL){ arr[k++] = arrL[a++]; } while (b < sizeR) { arr[k++] = arrR[b++]; } }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>

暫無
暫無

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

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