Javascript:无法在递归函数调用中重新分配变量



在下面的代码中,我将检查字符串在某个网格中是否"可拼写",类似于拼字游戏。如果字母位于当前字母的正上方、下方、左侧或右侧,则可以使用字母。例如,"bcdedit"应返回TRUE,而"bcdedit"则应返回FALSE。

函数的执行完全符合我的预期,除了第32-33行的。根据我的理解,wordExists = true行应该覆盖第9行的原始声明。

我错过了什么?

repl.it链接=http://repl.it/Yhh/5

var grid = [
    ['a','b','c','d'],
    ['e','f','g','h'],
    ['i','j','k','l'],
    ['m','n','o','p']
];
function doesWordExist(word, grid) {
    var wordExists = false;
    for (var i = 0, end = grid.length; i < end; i++){
        for (var j = 0, stop = grid[0].length; j < stop; j++) {
            if (word[0] === grid[i][j]) {
                doesLetterExist(word, i, j, 1);
            }
        }
    }
    return wordExists;
}
function isMatch(letter,i,j) {
    return (
        grid[i] !== undefined && 
        grid[i][j] !== undefined &&
        letter === grid[i][j]
    );
}
function doesLetterExist(word, i, j, depth) {
    console.log('i:' +i + " - j:" + j);
    var letter = word[depth];
    if (letter === undefined) {
        wordExists = true;
        console.log('can't re-define global "wordExists" variable :-(');
    }
    if (isMatch(letter,i, j + 1)) { // look right, j + 1
        doesLetterExist(word, i, j + 1, depth + 1);
    } else if (isMatch(letter, i, j -1)) { // look left, j - 1
        doesLetterExist(word, i, j - 1, depth + 1);
    } else if (isMatch(letter, i - 1, j)) { // look up, i - 1
        doesLetterExist(word, i - 1, j, depth + 1);
    } else if (isMatch(letter, i + 1, j)) { // look down, i + 1
        doesLetterExist(word, i + 1, j, depth + 1);
    }
}
doesWordExist('bcd', grid);

谢谢!

编辑:我从标题中删除了"全局"一词。我错误地将第一个函数中实例化的变量称为全局变量。它应该在其范围内的所有功能中都可以使用和更改,对吗?这就是我所说的"全球性",它对所有的儿童功能来说都是全球性的。

您在第9行中将wordExists定义为局部变量

var wordExists = false;

从上述中取出var

它应该在其范围内的所有功能中都可以使用和更改,对吗?它对所有的子功能来说都是全局性的。

是的。只是isMatchdoesLetterExist不是doesWordExist的子函数!它们被宣布在其体外。我们需要嵌套它们,以便它们能够访问其父作用域:

function doesWordExist(word, grid) {
    var wordExists = false;
    for (var i = 0, end = grid.length; i < end; i++){
        for (var j = 0, stop = grid[0].length; j < stop; j++) {
            if (word[0] === grid[i][j]) {
                doesLetterExist(word, i, j, 1);
            }
        }
    }
    return wordExists;
    function doesLetterExist(word, i, j, depth) {
        console.log('i:' +i + " - j:" + j);
        var letter = word[depth];
        if (letter === undefined) {
            wordExists = true;
        }
        if (isMatch(i, j + 1)) { // look right, j + 1
            doesLetterExist(word, i, j + 1, depth + 1);
        } else if (isMatch(i, j -1)) { // look left, j - 1
            doesLetterExist(word, i, j - 1, depth + 1);
        } else if (isMatch( i - 1, j)) { // look up, i - 1
            doesLetterExist(word, i - 1, j, depth + 1);
        } else if (isMatch(i + 1, j)) { // look down, i + 1
            doesLetterExist(word, i + 1, j, depth + 1);
        }
        function isMatch(i, j) {
            return grid[i] !== undefined && 
                   grid[i][j] !== undefined &&
                   letter === grid[i][j];
        }
    }
}

类似地,isMatch函数现在可以访问letter变量,因为它是doesLetterExist函数的一部分,不再需要将其作为参数传递。


然而,尽管您的函数现在可以工作,但它仍然不是最佳的。当wordExists设置为true时,您应该能够突破doesWordExist——您已经知道解决方案了。目前,你正在继续循环——这是一个相当沉重的循环。尝试改进您的原始算法(使用3个单独的函数),这样您就不会有"全局"wordExists变量,而是在每个函数中只使用return-doesLetterExist在找到字母后应立即返回return true,并且只有在筛选完所有递归调用后才返回false

相关内容

  • 没有找到相关文章