Lisp:如何使用递归来定义给定非负整数N的函数,生成从1到包括N的所有整数的列表?

Mei*_* Xu 1 lisp syntax common-lisp syntax-error

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

(defun numbers (N)  
  (if (<= N 0)
      nil
      (cons N nil)
      (numbers (- N 1)))
Run Code Online (Sandbox Code Playgroud)

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

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

; caught STYLE-WARNING:
;   The variable N is defined but never used.
; 
; compilation unit finished
;   caught 1 ERROR condition
;   caught 1 STYLE-WARNING condition
Run Code Online (Sandbox Code Playgroud)

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

Rai*_*wig 6

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

通常在Lisp中,如Common Lisp,if运算符允许以下语法:

IF test-form then-form [else-form]
Run Code Online (Sandbox Code Playgroud)

这意味着在Lisp中通常允许零或一个else形式.ifCommon Lisp 就是一个例子.

在Emacs中,Lisp 允许多个其他形式.Emacs Lisp具有以下语法:

IF test-form then-form else-form* 
Run Code Online (Sandbox Code Playgroud)

这意味着在Emacs Lisp 中允许使用零个或多个其他形式.

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

你的代码

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

你的代码:

(defun numbers (N)  
  (if (<= N 0)
      nil
    (cons N nil)
    (numbers (- N 1)))
Run Code Online (Sandbox Code Playgroud)

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

b)假设您使用带有多个其他形式的IF语法的Emacs Lisp .

你的代码:

(defun numbers (N)  
  (if (<= N 0)
      nil
    (cons N nil)
    (numbers (- N 1)))
Run Code Online (Sandbox Code Playgroud)

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

语法错误:缺少右括号

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

(defun numbers (N)  
  (if (<= N 0)
      nil
      (cons N nil)
      (numbers (- N 1)))
Run Code Online (Sandbox Code Playgroud)

如您所见,最后缺少一个右括号.

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

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

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

大多数人更喜欢后者.