2014-04-17 23 views
0

我從這個page嘗試的例子雖然我試圖創造一個後序遍歷看到例如前序遍歷的,列表不接受特殊字符在結束

(defun bin-tree-postorder (B) 
    "Create a list containing keys of B in preorder." 
    (if (bin-tree-leaf-p B) 
     (list (bin-tree-leaf-element B)) 
    (let ((elmt (bin-tree-node-element B)) 
      (left (bin-tree-node-left B)) 
      (right (bin-tree-node-right B))) 
     (cons (bin-tree-postorder left) 
      (cons (bin-tree-postorder right) elmt))))) 

我越來越(((2) (3) . +) ((7) (8) . -) . *) 但我慾望'(2 3 + 7 8 - *)。當我嘗試使用append時,它會顯示「APPEND:正確的列表不能以結尾」錯誤。如果預先附加任何 +, - ,/ etc的罰款,但最後爲什麼它會抱怨?

我需要幫助解決這個問題。

+0

請確保您的代碼正確縮進和格式化。 –

+0

@RainerJoswig:我對lisp沒有太多的經驗,我會在將來的文章中注意到這一點。謝謝。 – Rorschach

回答

3

你不是在這個代碼構建你什麼:

(cons (bin-tree-postorder left) 
     (cons (bin-tree-postorder right) 
      elmt)) 

考慮以下幾點:

> (cons 2 (cons 3 '+)) 
(2 3 . +) 

> (cons (list 2) (cons (list 3) '+)) 
((2) (3) . +) 

this answer,看一下Dot notation in scheme更多關於什麼在.符號一個列表意味着,但是精簡版本是Lisps(包括Scheme)中的一個正確列表是:

  • 空列表();或
  • 一個cons單元,其car是列表中的第一個元素,其cdr正確的列表,它是列表的其餘部分。

這意味着,做一個列表(2 3 +),你需要的

(cons 2 (cons 3 (cons '+ '()))) 

相當於你實際所得到的是不同的:

你沒有構建你要什麼在此代碼:

(cons (bin-tree-postorder left) 
     (cons (bin-tree-postorder right) 
      elmt)) 
  • 由於left2(bin-tree-postorder left)(2)
  • 由於right3(bin-tree-postorder right)(3)
  • 由於elmt+elmt(3)

那麼你所得到的是

> (cons '(2) (cons '(3) '+)) 
((2) (3) . '+) 

如果你想使用append,那麼你需要將最後一個參數作爲正確的列表。例如:

(append (bin-tree-postorder left) (bin-tree-postorder right) (list elmt)) 
相關問題