Переписать Java-операторы if в синтаксисе clojure - PullRequest
0 голосов
/ 29 мая 2019

У меня есть набор рекурсивных операторов if, написанных на Java, и я попытался использовать их для закрытия синтаксиса, но получил ошибку ArrayOutOfBound.Функции принимают row = 0, col = 0 и многомерный массив символов.

Это код Java:

public static boolean solveMaze(int r, int c, char[][] maze) {

    //check for boundaries
    if(r < 0 || c < 0 || r >= maze.length || c >= maze[0].length)
        return false;
    //base case, did i reach the finish?
    if(maze[r][c] == '@')
        return true;
    //check if I'm at a valid point
    if(maze[r][c] != '-')
    //I have hit a wall, not a valid solution
        return false;
    //must be on a path, may be the right path
    //leave a bread crumb
    maze[r][c] = '!';
    //check above
    if(solveMaze(r-1,c, maze)) {

        maze[r][c] = '+';
        return true;
    }
    //check below
    if(solveMaze(r+1,c, maze)) {

        maze[r][c] = '+';
        return true;
    }
    //check left
    if(solveMaze(r,c-1, maze)) {

        maze[r][c] = '+';
        return true;
    }
    //check right
    if(solveMaze(r,c+1, maze)) {

        maze[r][c] = '+';
        return true;
    }
    //if I reach this point...
    return false;
}

Это мой код в clojure, который предоставляет индекс изсвязанная ошибка:

    (defn solveMaze [r c m]
    (def tt true)
    ;(def che false)

    ;check to verify boundaries
    (if (or (or (or (< r 0) (< c 0)) (>= r (count m))) (>= c (count (str (m 0)))))
        false
        true
    )
    ;Check to know if the @ symbol has been found
    (if (= (get-in m[r c]) "@")
        true
        false
    )
    ;Checking if current index is a valid one
    (if (not= (get-in m[r c]) "-")
        ;Wall hit
        false
        true
    )
    ;found a path, leave a breadcrumb
    (def temp_map (assoc-in m[r c] "!"))
    ;Check North
    (if (= (solveMaze (dec r) c m) true)
        (def temp_map (assoc-in m [r c] "+"))
        true   
        ;false
    )
    ;Check South
    (if (= (solveMaze (inc r) c m) true)
        (def temp_map (assoc-in m[r c] "+"))
        true
        ;false
    )
    ;Check East
    (if (= (solveMaze r (dec c) m) true)
        (def temp_map (assoc-in m[r c] "+"))
        true
        ;false
    )
    ;Check West
    (if (= (solveMaze r (inc c) m) true)
        (def temp_map (assoc-in m[r c] "+"))
        true
        ;false
    )
    ;If code gets here
    (= tt false)

)

Пожалуйста, что-то я делаю неправильно ???Я пробовал несколько конструкций if, использующих clojure, но это не работает.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Вам необходимо ознакомиться с основами Clojure:

0 голосов
/ 30 мая 2019

Используйте cond для решения этой проблемы вместо if.Код выполняется теперь так: сначала выполняется вычисление if, а затем он переходит на следующую строку для выполнения оставшейся части кода.С помощью cond, если выражение оценивается как истинное, оно возвращает значение и не будет оценивать другие выражения.

См .: https://clojuredocs.org/clojure.core/cond

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...