我想在Common Lisp中使用GNU ClISP編寫一個程序來編譯它。我想輸入一個列表,如(A(B (C)()) (D (E) (F (G)())))
,並根據第一個單詞打印前,後或後序遍歷。示例:Common Lisp Binary Tree
(pre '(A(B (C)... etc))
我無法將我的邏輯轉換爲Clisp符號。我目前有以下代碼:
(defun leftchild (L)(cadr L))
(defun rightchild (L)(caddr L))
(defun data (L)(car L))
(defun pre (L)(if (null L) '()((data L)(pre(leftchild L))(pre(rightchild L)))))
... similar in and post functions
我收到編譯錯誤,說我應該在我的前函數中使用lambda。我認爲這是由於double(數據的前面,因爲它需要一個命令,但我不確定我應該放在那裏,我不認爲cond會起作用,因爲這會阻礙遞歸循環,將數據L打印,因爲它是現在編譯器不識別(print (data L))
我一直在這個代碼工作了一個多星期,試圖自己排除它,但我很茫然。如果有人可以解釋我做錯了什麼
另一個問題,我有我如何使程序提示行用戶輸入(前'(A ...等)),以便當我運行程序將運行的編譯文件而不是發出funcall錯誤?
謝謝你的時間。
對不起,我匆匆詢問了一下你的問題。 :)你的問題只是你使用了'if'而沒有'progn'用於多種形式(參見我的答案的最後一句)。也就是說,你的'pre'應該是這樣的:'(defun pre(n)(if(null n)'()(progn(print(data n))(pre(leftchild n))(pre(rightchild n)) )))'。在這種情況下,你也可以使用'cons',而不使用'progn'。我會留下答案,因爲我認爲這對搜索「[二進制樹]」的人會有用。順便說一句,你爲什麼認爲'cond'會阻礙遞歸循環? – danlei
謝謝你的迴應。我認爲cond可能會阻礙循環,因爲它會要求您將所有條件設置爲true,以使程序運行所有「其他」情況,但現在我認爲它可以工作,因爲最初的if語句會檢查空值。 我添加了你建議的預測,它遍歷循環並打印出它應該的樣子。我怎樣才能避免在列表末尾打印零? – Tijgerlili
我修好了。它不再打印零。我現在唯一的問題是試圖打印到一個文件,但我會繼續嘗試。 :) – Tijgerlili