2013-03-04 172 views
1

我要寫一個lisp程序來產生一個十六進制數的實際值。我寫了一個函數,但似乎得到一個stackoverflow(深)錯誤。我想知道是否有人能指出我的錯誤,或指引我朝着正確的方向前進。Lisp編程錯誤(堆棧溢出(深))

我將不勝感激,如果沒有代碼發佈的這個問題,因爲這是一個家庭作業的一部分。因此,我只想解釋或指示哪裏可能會出錯。

我覺得我的問題是,我的遞歸沒有終止,但我不知道如何解決它。

這裏是我的代碼:

(defun calc (hex) 
    (if hex 
    (if (> (length hex) 1) 
    (+ (first (reverse hex)) (* 16 (calc (reverse hex)))) hex))) 

在此先感謝。

+0

只是爲了澄清,輸入的類型是什麼?它是一個數字還是一個字符串或別的東西?並且我假設輸出應該是相同的數字,但是以10爲基數是正確的? – 2013-03-04 01:53:10

+0

該數字是類型'(7 d d)類型的列表的一個十六進制數字分解列表 – anonuser0428 2013-03-04 03:51:38

+0

而輸出應該是一個基數爲10的數字。 – anonuser0428 2013-03-04 04:00:38

回答

3

「基本情況」(遞歸實際停止的情況/狀態)是hex的長度爲1或更小。告訴我,每次你再次致電calccalc的輸入是否越來越小?如果不是,那麼在數學上不可能達到基本情況。

比方說hex開始長度爲9.當你調用calc再次,你已經扭轉hex。所以現在hex被顛倒,,但它仍然有9的長度。我懷疑這就是遞歸從未停止的原因。

+0

omg不,不,謝謝我認爲這是問題所在。我打算打電話(休息(反向十六進制)),而不僅僅是(反向十六進制) – anonuser0428 2013-03-04 03:52:34

+0

我有最後一個問題。你會碰巧知道我可以如何將字符d之類的項轉換爲十進制形式13而不使用parse-integer函數嗎?我讀了lisp使用〜x,但由於某種原因,這似乎不適用於我。 – anonuser0428 2013-03-04 04:23:56

+0

順便說一句,如果有人想知道我如何最終解決了十六進制表示問題,我被告知使用COND函數,這是java中的switch-case的lisp等價物。相當醜陋和硬編碼,但它完成了工作。 – anonuser0428 2013-03-04 21:04:49