2017-09-14 6 views
-2

INPUT:((B(D(E)(F)))(C)(K)) 私は現在、私の出力を与える二つの機能を有する:dolistを使用せずに再帰のみのlispでtreeを印刷するには?

B

C

K

B

D

D

E

F

E

NIL

私はこのような出力を必要しかし:
:BCK
B:D
C:
をk:
D:

E F E:

F:

F

又は

B S K

D

E

(defun print-children (s) 
    (cond ((null (caar (cdr s))) nil) 
     (t (print (caar (cdr s))) (print-children (cdr s))))) 

(defun print-tree (s) 
    (cond ((null s) nil) 
     ((atom (car s)) (print (car s)) (print-children s) (print-tree (cdr s))) 
     (t (print-tree (car s))))) 
+2

私はこの質問を理解していません。 「新しい行からすべて」 - これはどういう意味ですか?あなたの質問には、予想される入力と出力の有用な例がありません。 –

+1

@RainerJoswigがそれを変更しました、それはより明確ですか? – ninjaknight

+0

@RainerJoswig新しくスタックするために、すべての情報を追加するのを忘れました – ninjaknight

答えて

5

ノード

あなたが定義する最初にすべきこと:ノードのためのいくつかのデータ構造関数。

  • nodepは - >ノードの事でしょうか?
  • node-nameノード - >ノードの名前を返す
  • node-childrenノード - >ノード

幅優先

の子供を返すそれから私は、関数を定義します木を幅優先順に横断する。

  • breadth-firstツリー&optional FNキュー

この関数は、幅優先順にツリーのすべての要素にFNを呼ぶだろう。

  1. がキュー
  2. コール機能FNの終わりに
  3. プッシュを現在のノードとして現在のノードのノードの子をキューから最初のノードを取る
  4. どのノード、エンドが存在しない場合現在のノード上の
  5. ツリーと呼び出し自体をFNキュー

このループを再帰関数として記述します。

コール幅優先

CL-USER 76 > (breadth-first '(A (B (D (E) 
             (F))) 
           (C) 
           (K)) 
          (lambda (node) 
           (princ (node-name node)) 
           (princ ":") 
           (mapc (lambda (child) 
             (princ (node-name child))) 
            (node-children node)) 
           (terpri))) 
A:BCK 
B:D 
C: 
K: 
D:EF 
E: 
F: 
+0

ラムダなしでどのように見えますか? – ninjaknight

+0

私たちの仕事は基本的な機能に制限されています:car、cdr、cons、cond、for、print、list-length、format、apply、atom、setq – ninjaknight

関連する問題