簡體   English   中英

為什么這個遞歸函數會給我一個“超出最大調用堆棧大小”的錯誤?

[英]Why does this recursive function get me a “Maximum call stack size exceeded” error?

我正在創建一個帶有HTML畫布的繪圖應用程序,我正在嘗試實現一個“繪制桶”工具,該工具可以檢測與所點擊的像素顏色相同的任何相鄰像素,並用新顏色填充它。

我得到一個“未捕獲的RangeError:超出最大調用堆棧大小”,但我無法弄清楚我的邏輯有什么問題:

function fillTool(){
    theCanvas.mousedown(function(e){
        var baseColor = paintUtilities.getPixelColor(e.offsetX, e.offsetY);
        context.fillStyle = color;
        fillNeighbors(e.offsetX, e.offsetY, baseColor);
    });
}

function fillNeighbors(x, y, baseColor) {
    context.fillRect(x, y, 1, 1);
    if (x > 0 && paintUtilities.getPixelColor(x - 1, y) === baseColor) {
        fillNeighbors(x - 1, y, baseColor);
    }
    if (y > 0 && paintUtilities.getPixelColor(x, y - 1) === baseColor) {
        fillNeighbors(x, y - 1, baseColor);
    }
    if (x < theCanvas.attr("width") - 1 && paintUtilities.getPixelColor(x + 1, y) === baseColor) {
        fillNeighbors(x + 1, y, baseColor);
    }   
    if (y < theCanvas.attr("height") - 1 && paintUtilities.getPixelColor(x, y + 1) === baseColor) {
        fillNeighbors(x, y + 1, baseColor);
    }   

}

實際上在第二次看,我看到你的代碼的問題,它確實有無限的遞歸!

假設你從x = 1開始,x可以從0到2.你先左轉,然后遞歸調用函數。 該功能最終會向右移動! 那個循環將永遠重復。 您需要跟蹤您訪問過的位置,或者將遞歸函數傳遞給不繼續的方向,或者沿着這些方向傳遞。

因為它是一個遞歸函數,並且在每個if語句中一次又一次地調用它...該函數沒有基本情況。

暫無
暫無

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

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