首页 > 解决方案 > Lisp:如何使用递归来定义一个给定非负整数 N 的函数,生成从 1 到包括 N 的所有整数的列表?

问题描述

在 lisp 中编写一个名为 number(N) 的函数,您必须使用非负整数 N,并生成从 1 到包括 N 的所有整数的列表。

(defun numbers (N)  
  (if (<= N 0)
      nil
      (cons N nil)
      (numbers (- N 1)))

我检查了一些问题,但大多数都使用循环和范围,但是这个问题不允许我这样做,所以我必须使用递归:

这是我的代码,但这段代码不断给我警告:

; caught STYLE-WARNING:
;   The variable N is defined but never used.
; 
; compilation unit finished
;   caught 1 ERROR condition
;   caught 1 STYLE-WARNING condition

我认为我的算法是正确的,但是因为我是 lisp 新手,所以我仍然不知道如何正确编写函数。如果有人能给我任何帮助,我将不胜感激。

标签: syntaxsyntax-errorlispcommon-lisp

解决方案


IF 通常具有通用语法,但也有例外

通常在像 Common Lisp 这样的 Lisp 中,if运算符允许以下语法:

IF test-form then-form [else-form]

这意味着在 Lisp 中,通常允许零个或一个else 形式。一个例子是if在 Common Lisp 中。

在 Emacs Lisp中,允许使用多个else-forms 。Emacs Lisp 具有以下语法:

IF test-form then-form else-form* 

这意味着在 Emacs Lisp中允许零个或多个else-forms 。

因此:重要的是要提及您实际使用的语言和方言。

你的代码

a) 假设您使用 Common Lisp 及其IF语法。

你的代码:

(defun numbers (N)  
  (if (<= N 0)
      nil
    (cons N nil)
    (numbers (- N 1)))

您的代码存在问题,即有多个 else 子句。您需要编写一个具有单个 else 子句的版本。

b) 假设您使用 Emacs Lisp 及其IF语法和多种 else 形式。

你的代码:

(defun numbers (N)  
  (if (<= N 0)
      nil
    (cons N nil)
    (numbers (- N 1)))

此处(cons N nil)允许使用表单,但没有效果。它的返回值没有被使用,也没有副作用。你可以删除它,它没有任何区别。再说一遍:您需要如何将其效果与 form 结合起来(numbers (- N 1))

语法错误:缺少右括号

您的代码中还有另一个问题。s 表达式不完整 -> 缺少右括号:

(defun numbers (N)  
  (if (<= N 0)
      nil
      (cons N nil)
      (numbers (- N 1)))

如您所见,最后缺少右括号。

因此,您的代码无法被 Lisp 读取。

通常有两种方法可以避免这个问题:

  • 计算括号并相应地设置它们
  • 使用编辑器计算括号

大多数人更喜欢后者。


推荐阅读