我試圖編寫一個打印深度列表的函數。 例如 (1(2(3 4))6 9(3 5)) 它將列表(或樹)作爲參數,並對其進行遍歷並進行打印。 現在我可以返回列表。但我想穿過它。打印一個深度列表
我想修改「深表逆轉」的代碼,但我似乎無法做到這一點。 有什麼想法?
我試圖編寫一個打印深度列表的函數。 例如 (1(2(3 4))6 9(3 5)) 它將列表(或樹)作爲參數,並對其進行遍歷並進行打印。 現在我可以返回列表。但我想穿過它。打印一個深度列表
我想修改「深表逆轉」的代碼,但我似乎無法做到這一點。 有什麼想法?
(define (dft fun tree)
(if (not (pair? tree))
(fun tree)
(for-each (lambda (st) (dft fun st)) tree)))
基本上,你做正常的遞歸除非(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)))])))
(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語句是需要的,因爲我們想要一個接一個地做兩個動作,但不關心它們的返回值。
編輯:我剛剛學到了那個列表?遍歷整個列表,看看它是否是一個正確的列表,而不是對?我切換了我的名單?一對?
問題是要求計劃代碼... – erjiang 2010-12-05 01:41:30