2013-11-04 98 views
-1

我正在嘗試在Common Lisp中編寫一個函數,將一個基數爲10的數字轉換爲以列表形式遞歸表示的基數8數字。將十進制數轉換爲八進制Lisp

這是我到目前爲止有:當我輸入數字< 8> -8,但遞歸的情況下,給了我很多的麻煩

(defun base8(n) 
(cond 
    ((zerop (truncate n 8)) (cons n nil)) 
    ((t) (cons (mod n 8) (base8 (truncate n 8)))))) 

此功能工作正常。當我嘗試8作爲參數(應返回(1 0))時,出現錯誤Undefined operator T in form (T)

在此先感謝。

回答

1

看來你已經忘記了(defun t ...)或者它可能不是你想要在cond中具有的功能t?也許這是t的真值?

Common Lisp的雙重命名空間特性使t成爲函數和真值成爲可能。不同之處在於您使用的上下文環境,而您顯然正嘗試將t用作函數/宏。

下面是編輯的真值,而不是t函數的代碼:

(defun base8(n) 
    (cond 
    ((zerop (truncate n 8)) (cons n nil)) 
    (t (cons (mod n 8) (base8 (truncate n 8)))))) 

(base8 8) ; ==> (0 1) 
+0

謝謝!我的意思是't'是真值。這解決了它,所以它可以像我期望的那樣工作。現在我想擁有我正在返回的反向列表。有可能只在一個函數中做到這一點,或者我必須有一個幫助函數? – user2177693

+0

沒關係,我計算出來: (defun定義base8(N) (COND ((zerop(截去ñ8))(利弊Ñ無)) (噸(追加(base8(截斷ñ8))(利弊(mod n 8))nil))))) – user2177693

1

只是爲了好玩,這裏是沒有遞歸的解決方案,使用內置功能:

(defun base8 (n) 
    (reverse (coerce (format nil "~8R" n) 'list))) 
+0

謝謝,但特別是對於練習,我不認爲這是最有幫助的。 – user2177693

+0

沒錯。歡天喜地。 –

相關問題