【问题标题】:Lisp Programming Error (Stack Overflow (deep))Lisp 编程错误(堆栈溢出(深))
【发布时间】:2013-03-04 01:44:27
【问题描述】:

我要编写一个 lisp 程序来生成十六进制数的实际值。我已经编写了一个函数,但似乎遇到了 stackoverflow (deep) 错误。我想知道是否有人可以指出我的错误或指导我正确的方向。

如果没有针对此问题发布代码,我将不胜感激,因为这是家庭作业的一部分。因此,我只想要一个可能出错的解释或方向。

我觉得我的问题是我的递归没有终止,但我不知道如何解决它。

这是我的代码:

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

提前致谢。

【问题讨论】:

  • 澄清一下,输入的类型是什么?它是数字还是字符串或其他东西?我假设输出应该是相同的数字,但以 10 为底正确吗?
  • 数字是 '(7 d d) 类型的列表,是十六进制数字的分解列表
  • 输出应该是一个以 10 为基数的数字。

标签: recursion lisp


【解决方案1】:

“基本情况”(递归实际停止的情况/状态)是hex 的长度为 1 或更少。告诉我,每次你再次调用calccalc 的输入是不是越来越小了?如果不是,那么输入在数学上是不可能达到基本情况的。

假设hex 以长度9 开头。当你再次调用calc 时,你已经反转了hex。所以现在hex 被反转了,但它的长度仍然是 9。我怀疑这就是递归永远不会停止的原因。

【讨论】:

  • 天哪,不,谢谢,我认为这就是问题所在。我的意思是调用 (rest (reverse hex)) 而不仅仅是 (reverse hex)
  • 我有最后一个问题。您是否知道我如何能够在不使用 parse-integer 函数的情况下将字符 d 之类的项目转换为其十进制形式 13?我读到 lisp 使用 ~x 但由于某种原因这似乎对我不起作用。
  • 顺便说一句,如果有人想知道我是如何最终解决十六进制表示问题的,我被告知要使用 COND 函数,它是 lisp 等效于 java 中的 switch-case。相当丑陋和硬编码,但它完成了工作。
猜你喜欢
  • 2018-08-27
  • 2012-08-20
  • 2021-06-11
  • 2013-06-06
  • 1970-01-01
  • 2014-01-26
  • 2019-02-16
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多