Рекурсия в Javascript не работает (вопросы по CodeWars) - PullRequest
0 голосов
/ 25 января 2019

Я работаю над вопросом о Codewars уже минуту.Я в значительной степени покончил с этим, если бы я мог заставить эту рекурсию работать в моей функции.Предполагается, что это будет поиск в глубину, но после первого сбоя рекурсивные вызовы не выполняются.Я укажу на проблемную область.https://www.codewars.com/kata/path-finder-number-1-can-you-reach-the-exit/train/javascript

function pathFinder(maze) {
    maze = maze.split('').filter(e => e !== '\n').join('');
    let length = Math.sqrt(maze.length);
    console.log('length', length);
    let map = maze.split('');
    let checked = new Array(maze.length);
    checked.fill(false);
    let won = [];
    helper(0, length, map, checked, won);
    return won.length > 0;
}

function helper(pos, length, map, checked, won) {
    console.log(pos);
    if (pos == map.length - 1) {
        won.push(true);
    }
    checked[pos] = true;
    let up = down = left = right = false;
    up = checkUp(pos, length, map, checked);
    down = checkDown(pos, length, map, checked);
    left = checkLeft(pos, length, map, checked);
    right = checkRight(pos, length, map, checked);
    console.log("U",up,"D",down,"L",left,"R",right);
***************
AT THE FOLLOWING IF STATEMENT, ONCE THE FIRST IF STATEMENT IS TRUE, 

THE OTHER ONES DO NOT GET EXECUTED(ex if Up = true, and Down = true,

only Up will get executed)
***************
    if (up) {
        console.log("U")
        helper(pos += length, length, map, checked, won);
    }
    if (down) {
       console.log("D")
       helper(pos -= length, length, map, checked, won);
    }
    if (left) {
        console.log("L")
        helper(pos -= 1, length, map, checked, won);
    }
    if (right) {
        console.log("R")
        helper(pos += 1, length, map, checked, won);
    }
}

function checkRow(prev, next, length) {
    return Math.floor(prev / length) - Math.floor(next / length);
}

function checkUp(prev, length, arr, checked) {
    let next = prev + length;
    return (arr.length && (checkRow(prev, next, length) == -1) && arr[next] == '.' && !checked[next]);
}

function checkDown(prev, length, arr, checked) {
    let next = prev - length;
    return (next >= 0 && (checkRow(prev, next, length) == 1) && arr[next] == '.' && !checked[next]);
}

function checkLeft(prev, length, arr, checked) {
    let next = prev - 1;
    return (next >= 0 && (checkRow(prev, next, length) == 0) && arr[next] == '.' && !checked[next]);
}

function checkRight(prev, length, arr, checked) {
    let next = prev + 1;
    return (next <= arr.length && (checkRow(prev, next, length) == 0) && arr[next] == '.' && !checked[next]);
}

1 Ответ

0 голосов
/ 25 января 2019

Ваша проблема, вероятно, в следующем:

let up = down = left = right = false;

инициализирует только одну переменную: up.

Просто переключение в строгий режим с "use strict"; в начале файла выявляет проблему:

let up = вниз = влево = вправо = false; ^

ReferenceError: право не определено

...