2013-03-04 139 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