2

任务:使用 List 将字符串定义为字符列表,并编写递归函数以返回字符串的长度。

我为此作业编写了代码,但它不起作用。

以下是我的代码:

(defun stringlength  (string)
 ;;  "Compute the length of str."

   (if (string= string nil )   0

       (+ 1 (stringlength(subseq string 1)))))

在命令行中我输入:

cl-user(32): (stringlength "aaa")

它给了我错误:

Stack overflow (signal 1000)
  [condition type: synchronous-operating-system-signal]

有人可以帮我吗?非常感谢!!!

4

1 回答 1

2
(defun stringlength (string)
  (if (string= string nil)
      0
      (+ 1 (stringlength (subseq string 1)))))

您应该记录或测试该函数是否需要一个字符列表。否则会令人困惑,因为 STRING 和字符串操作是内置在 Lisp 中的,而字符串不是列表。

你已经被它弄糊涂了;-)。STRING=是一个来自 Lisp 的函数,它是为内置类型定义的STRING。您不能使用它,因为您的任务是对字符列表执行操作。也是SUBSEQ错误的功能。

要替换STRING=,您需要一个函数来测试某些内容是否为空列表。

要替换SUBSEQ您需要一个函数,该函数返回删除了 head 元素的列表。

(stringlength "aaa")

那么上面的也是错误的。您需要使用字符列表而不是内置字符串类型来调用它。看你的任务。查看函数LIST并查看 Lisp 中的字符是如何编写的。

于 2012-07-23T08:20:15.033 回答