2010-12-04 50 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)))))) 

我覺得這是做的最簡單的方法。

這是一個遞歸函數,其基本情況爲空列表。

然後,如果列表的頭部是另一個列表,它將先行走該列表。然後它會走過列表的其餘部分。

否則,它將打印列表的頭部,並行走列表的其餘部分。

begin語句是需要的,因爲我們想要一個接一個地做兩個動作,但不關心它們的返回值。

編輯:我剛剛學到了那個列表?遍歷整個列表,看看它是否是一個正確的列表,而不是對?我切換了我的名單?一對?