![](/img/trans.png)
[英]React.js: Uncaught RangeError: Maximum call stack size exceeded
[英]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 start
、 middle
、 end
是索引。 因此 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.