Бьюсь об заклад, когда вы делали это на других языках, вы использовали стек для dfs и очередь для bfs. Когда вы выполняете поиск в глубину, вы в основном используете стек, чтобы решить, какой узел следует исследовать следующим, а рекурсия дает вам стек вызовов функций, поэтому легко понять, как эти два отражают друг друга. При первом поиске по ширине возникает вопрос: как вы рекурсивно пересекаете очередь?
Теперь вспомните, что все, что вы можете делать итеративно, вы можете делать рекурсивно. Там, где вы можете написать «пока x <10: x + = 1», вместо этого вы можете написать </p>
(define (my-loop x)
(if (< x 10)
(my-loop (+ x 1))
... ;; your base case
))
и вдруг вы делаете итерацию рекурсивно. Отлично.
Итак, у нас есть эта очередь. Мы кладем вещи с одного конца, снимаем вещи с другого. Точно так же, как мы обошли переменную управления циклом x в цикле выше, вам придется явно обойти очередь. В следующей «итерации», которая теперь становится следующим уровнем рекурсии, вы захотите поместить несколько новых дочерних элементов в очередь, и эта следующая рекурсия выведет одного дочернего элемента из другого конца очереди или остановит ) если детей больше нет.
Теперь стек вызовов больше не отражает ваше местоположение в дереве, поэтому трудно понять, почему рекурсия была бы лучше или интуитивнее, но это всегда возможно.
Надеюсь, это поможет,
Grem