2010-12-04 8 views
1

ディープリストを印刷する関数を作成しようとしています。 (1(2(3))6 9(3 5)) リストまたはツリーをパラメータとして使用し、それをトラバースして印刷します。 今すぐリストを返すことができます。しかし、私はそれを横切りたい。ディープリストを印刷する

「ディープ・リスト・リバーサル」のコードを修正すると思っていましたが、私はそれをすることができません。 アイデア? (car ls)を使用すると、2つの再帰呼び出しと分岐した時点で、ペアでない限り、

答えて

0

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

質問は、Schemeコードを要求しています... – erjiang

+0

解決策はひどいです。葉ノード以外の値を持たないバイナリツリーを想定しており、defineとcondの使い方がわからないことを示しています。 – drdo

+0

私は、傲慢で、役に立たないようなコメントは助けになるよりも、あなたの意見を聞いたほうがいいと思います。あなたの批判は根拠がなく、あなたがタイプする前にあなたが考えていないことを示すだけです。 – erjiang

1

は基本的に、あなたは、通常の再帰を行う(ネストされたリストには、ツリーであるので!)。

(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文は2つのアクションを1つずつ実行したいが、戻り値については気にしないので必要です。

編集:私はそのリストを知りましたか?それが適切なリストであるかどうかを見るために、リスト全体を通って、ペアとは対照的に?リストを切り替えましたか?ペアに?

関連する問題