javascript递归函数不会停止执行

时间:2019-05-09 17:53:42

标签: javascript recursion

在我的progress函数中,它将达到递归的基础,但是im期望返回的值不会改变。

let graph = [[1,1,1],[1,1,1,],[1,1,1]]

function findPath(graph){
    function progress(row, col){
        if(row == graph.length-1 && graph[row][col]== 1) {
            console.log('makes it here but does not return true !?')
            return true;
        } 

        //check right
        if(graph[row][col+1] == 1) {
            graph[row][col] = 2
            progress(row, col+1);
        }

        // check left 
        if(graph[row][col-1] == 1) {
            graph[row][col] = 2
            progress(row, col-1);
        }

        // check down
        if(graph[row+1][col] == 1){
            graph[row][col] = 2
            progress(row+1, col)
        }  
    }

    for(let i = 0; i < graph[0].length; i++) {
        if(graph[0][i] == 1) {
            if(progress(0, i)) {
                return true;
            }
        }
    }

    return false;
}

console.log(findPath(graph))

这应该返回true,它满足条件(记录文本),但随后继续移动,并且始终返回false。

1 个答案:

答案 0 :(得分:2)

好吧,递归与堆栈一起工作,每个调用都被堆叠,在完成所有其他调用之后,继续执行您的操作。

赞:

call1 -> call2 -> call3 -> callN

到达最后一个通话(callN)后,所有通话将从后往前取消堆叠。

您只是在上一次调用时返回true,但是当函数调用未堆积时,此值会丢失

换句话说,对于您的示例作品,您需要始终从progress函数返回值。

我试图修改您的代码以使其更好地工作:

let graph = [[1,1,1],[1,1,1,],[1,1,1]]

function findPath(graph){
    function progress(row, col){
        if(row == graph.length-1 && graph[row][col]== 1) {
            return true;
        } 

        //check right
        if(graph[row][col+1] == 1) {
            graph[row][col] = 2
            var right = progress(row, col+1);
        }

        // check left 
        if(graph[row][col-1] == 1) {
            graph[row][col] = 2
            var left = progress(row, col-1);
        }

        // check down
        if(graph[row+1][col] == 1){
            graph[row][col] = 2
            var down = progress(row+1, col)
        }

        // propagate result
        return (right || left || down)
    }

    for(let i = 0; i < graph[0].length; i++) {
        if(graph[0][i] == 1) {
            if(progress(0, i)) {
                return true;
            }
        }
    }

    return false;
}

console.log(findPath(graph))

我只看递归部分,而不是它本身的问题,在我的示例中,如果在任何路径(右,左或下)中,我都抓住该值并返回直到它到达我的第一个函数调用为止。这样,true值将一直传播到结束

希望我有所帮助