Получить переменную из глубокого рекурсивного цикла в схеме - PullRequest
1 голос
/ 31 марта 2011

У меня есть глубокий рекурсивный процесс, который выводит список, когда находит решение проблемы, но этот список создается очень глубоко рекурсивно.Это код:

(define (dfs start target)
  (define (dfs-helper start target path new-links final-path)
    (display final-path) (newline)
    (if (null? final-path)
       (if (or (null? new-links) (member start path)) '()
               (first-not-null (lambda (x)
                                 (if (= start target) (dfs-helper x target path '() (append path (list start))) (dfs-helper x target (append path (list start)) (get-neighbors x) final-path)))
                           (get-neighbors start))

       )
       final-path 
    )
 )
 (dfs-helper start target '() (get-neighbors start) '())
)

(я извиняюсь за странное форматирование)

В любом случае это выдает следующее:

...
()
()
(1 7 20 15 22 23 39 40 49 41 31 25 17 18 9 19 26 36 27 12 11 10 3 13 14 21 28 37 43 53 44 52 51 42 50 54 57 58 61 62 60 63)
7

Это та секунда из последнеголиния, которая мне нужна.Как вы можете видеть, когда я отображаю 'final-path', я получаю то, что хочу, но по какой-то причине (я думаю, что из-за всех рекурсивных вызовов) фактическая переменная в конце равна просто 7, а не списку всех чиселЯ хочу.Как я могу получить свой код для вывода этой секунды из последней строки, чтобы я мог манипулировать списком, который он возвращает?

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

Оог ... этот код может быть намного проще.Позвольте мне сделать несколько предложений.

Во-первых, определение помощника внутри родительской функции вам не поможет;это делает невозможным тестирование самостоятельно;переместить его на улицу.

Далее мне непонятно, почему у вас есть два аргумента: «путь» и «окончательный путь»;заявление о цели в одну строку было бы действительно полезным здесь.Частично это решает, что ваша функция должна возвращать при сбое.

Наконец, вам действительно нужны некоторые тестовые примеры, которые показывают, что вещь должна производить для простых входных данных.

Я понимаю, что вполне возможно, что вы ищете "быстрое решение";Я должен сказать вам, что решение, которое бросает изменяемую переменную поверх других вещей, конечно, не получит хорошую оценку в моем классе ...

Заранее извиняюсь за мой высокомерный тон :).

0 голосов
/ 31 марта 2011

вместо отображения final-path с новой строкой в ​​виде распечатки, к которой вы не можете добраться, создайте список как элемент вашего dfs объекта.Затем добавьте этот элемент списка и обработайте этот список по возвращении dfs.Например:

(define (dfs start target)
  (define return-list '()) ;;add a return list here that you will process later
  (define (dfs-helper start target path new-links final-path)
    ;;(display final-path) (newline)
    (set! return-list (cons final-path return-list)) ;;so you are now "building up" the return list
    (if (null? final-path)
       (if (or (null? new-links) (member start path)) '()
               (first-not-null (lambda (x)
                                 (if (= start target) (dfs-helper x target path '() (append path (list start))) (dfs-helper x target (append path (list start)) (get-neighbors x) final-path)))
                           (get-neighbors start))

       )
       final-path 
    )
 )
 (dfs-helper start target '() (get-neighbors start) '())

 ;;process the return-list value to get the values you're wanting from it ...
 ;;I'm guessing there is something specific you're looking for, i.e., you can
 ;;filter out all the empty-list elements, single-value elements, etc.
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...