2010-12-04 4 views
1

парень, пытающийся написать функцию, которая печатает глубокий список. например (1 (2 (3 4)) 6 9 (3 5)) он берет список (или дерево) в качестве параметра и просто обходит его и печатает. теперь я мог бы просто вернуть список. но я хочу пройти его.печать глубокого списка

Я думал о том, чтобы изменить код «глубокого разворота списка», но я не могу этого сделать. любые идеи?

ответ

0

(define (dft fun tree) 
    (if (not (pair? tree)) 
     (fun tree) 
     (for-each (lambda (st) (dft fun st)) tree))) 
+0

Вопрос запрашивает код схемы ... – erjiang 2010-12-05 01:41:30

1

В принципе, вы нормальная рекурсия, если (car ls) не пара, в какой момент вы ответвляетесь два рекурсивными вызовов (потому что вложенный список дерево!).

(define dft 
    (lambda (ls) 
     (cond 
     [(null? ls) '()] 
     [(pair? (car ls)) 
     (begin 
      (dft (car ls)) 
      (dft (cdr ls)))] 
     [else (begin (display (car ls)) (dft (cdr ls)))]))) 
0
(define (walk-print ls) 
    (if (null? ls) 
     '() ;; This can be anything 
      ;; I just picked '() as that was the simplest "nothing" value I could think of. 
     (if (pair? (car ls)) 
      (begin 
      (walk-print (car ls)) 
      (walk-print (cdr ls))) 
      (begin 
      (display (car ls)) 
      (walk-print (cdr ls)))))) 

Я думаю, что это самый простой способ сделать это.

Это рекурсивная функция с базовым регистром пустого списка.

Тогда, если глава списка - это еще один список, он будет первым в этом списке. Затем он переместит остальную часть списка.

В противном случае он распечатает головку списка и проследует остальную часть списка.

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

Редактировать: Я только что узнал этот список? просматривает весь список, чтобы увидеть, является ли он правильным списком, в отличие от пары ?. Я переключил свой список? к паре ?.

Смежные вопросы