在下面的代碼中,我將檢查一個字符串是否在某個網格中是「可拼寫的」,類似於Scrabble。如果字母直接位於當前字母的上方,下方,左側或右側,則可以使用字母。例如,「bcd」應該返回TRUE,而「bcdn」應該返回FALSE。Javascript:無法在遞歸函數調用中重新分配變量
功能執行完全按照我的預期,除了行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);
謝謝!
編輯:我從標題中刪除了「全局」一詞。我錯誤地將在第一個函數中實例化的變量稱爲全局變量。它應該是可用的,並且可以從其範圍內的所有功能更改?這就是我所說的'全球',它對所有兒童功能都是全球性的。
你可以重構你的算法不依賴於一個全局變量。 – elclanrs 2014-09-11 05:33:31
'function doesWordExist(word,grid){ var wordExists = false;'< - not global – epascarello 2014-09-11 05:37:38
'if(letter === undefined){ wordExists = true;'< - 實際上是全局的 – epascarello 2014-09-11 05:39:58