在我的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。
答案 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
值将一直传播到结束
希望我有所帮助