2016-12-05 5 views
2

Мне дали задание разрешить лабиринт, который представлен как неявный граф с использованием Racket. Я пытаюсь сделать это с помощью глубины первого поиска и рекурсия работает весь путь до места, где он должен вернуться и пойти по другому пути, где я получаю ошибку:Проблемы с обратным отсчетом на Racket

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: #<void> 
    arguments...: 
    #<void> 

Вот мой код:

#lang racket 

;; Maze as a matrix as input for the function 
;; # - Represents blocked path 
;; " " - Represents a blank space 
;; . - Represents a path 

(define maze '(
     ("#" "#" "#" "#" "#" "#" "#" "#" "#" "#") 
     ("#" "I" "#" " " " " " " " " " " " " "#") 
     ("#" " " "#" " " "#" "#" "#" "#" " " "#") 
     ("#" " " " " " " "#" " " " " "#" " " "#") 
     ("#" " " "#" " " "#" "#" " " " " " " "#") 
     ("#" " " "#" " " " " " " "#" "#" " " "#") 
     ("#" " " "#" "#" "#" " " "#" "F" " " "#") 
     ("#" " " "#" " " "#" " " "#" "#" "#" "#") 
     ("#" " " " " " " "#" " " " " " " " " "#") 
     ("#" "#" "#" "#" "#" "#" "#" "#" "#" "#") 
    ) 
) 

;; Prints the maze 
(define print (λ(x)(
    if (not (empty? x)) 
     (begin 
     (writeln (car x)) 
     (print (cdr x)) 
     ) 
     (writeln 'Done) 
))) 


;; Get the element on the position (x,y) of the matrix 
(define get (λ(lst x y) (
    list-ref (list-ref lst y) x) 
)) 
;; Sets element on the position (x,y) of the matrix 
(define set (λ(lst x y symbl)(
    list-set lst y (list-set (list-ref lst y) x symbl) 
))) 

;; Searches path on maze 
(define dfs (λ(lab x y)(
    (if (string=? (get lab x y) "F") 
     (print lab) 
     (begin0 
     (cond [(or (string=? (get lab (+ x 1) y) " ") (string=? (get lab (+ x 1) y) "F")) (dfs (set lab x y ".") (+ x 1) y)]) 
     (cond [(or (string=? (get lab (- x 1) y) " ") (string=? (get lab (- x 1) y) "F")) (dfs (set lab x y ".") (- x 1) y)]) 
     (cond [(or (string=? (get lab x (+ y 1)) " ") (string=? (get lab x (+ y 1)) "F")) (dfs (set lab x y ".") x (+ y 1))]) 
     (cond [(or (string=? (get lab x (- y 1)) " ") (string=? (get lab x (- y 1)) "F")) (dfs (set lab x y ".") x (- y 1))]) 
     ) 
     ) 
    ) 
)) 

Любая идея о том, почему это происходит?

ответ

2

Это Происходило из-за плохой отступ ...

Удалите набор скобок обертывания, если:

(define dfs 
    (λ (lab x y) 
    (if (string=? (get lab x y) "F") 
     (print lab) 
     (begin0 
      (cond [(or (string=? (get lab (+ x 1) y) " ") 
        (string=? (get lab (+ x 1) y) "F")) 
       (dfs (set lab x y ".") (+ x 1) y)]) 
      (cond [(or (string=? (get lab (- x 1) y) " ") 
        (string=? (get lab (- x 1) y) "F")) 
       (dfs (set lab x y ".") (- x 1) y)]) 
      (cond [(or (string=? (get lab x (+ y 1)) " ") 
        (string=? (get lab x (+ y 1)) "F")) 
       (dfs (set lab x y ".") x (+ y 1))]) 
      (cond [(or (string=? (get lab x (- y 1)) " ") 
        (string=? (get lab x (- y 1)) "F")) 
       (dfs (set lab x y ".") x (- y 1))]))))) 
Смежные вопросы