2017-09-14 52 views
-2

INPUT:(A(B(d(E)(F)))(C)(K)) 我現在有兩個功能,這給我的OUTPUT:如何在沒有dolist的情況下在lisp中打印樹,只有遞歸?

ç

ķ

d

d

Ë

˚F

Ë

NIL

但是我需要輸出這樣的:
一個:BCK
B:d
C:
k:
d:電子網

E:

F:

一個

b】S K

d

電子網

(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-firstFN&optional隊列

此功能將呼籲在廣度優先的順序樹的所有元素FN

  1. 如果沒有節點,端
  2. 起飛隊列中的第一個節點爲當前節點
  3. 推當前節點的子節點到隊列
  4. 呼叫功能FN的端部在當前節點上
  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

沒有lambda表達式,它看起來怎麼樣? – ninjaknight

+0

我們的任務僅限於基本功能:car,cdr,cons,cond,for,print,列表長度,格式,apply,atom,setq – ninjaknight

相關問題