在下面的代码中,我将检查字符串在某个网格中是否"可拼写",类似于拼字游戏。如果字母位于当前字母的正上方、下方、左侧或右侧,则可以使用字母。例如,"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
它应该在其范围内的所有功能中都可以使用和更改,对吗?它对所有的子功能来说都是全局性的。
是的。只是isMatch
和doesLetterExist
不是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
。