syntax - 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 新手,所以我仍然不知道如何正确编写函数。如果有人能给我任何帮助,我将不胜感激。
解决方案
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 读取。
通常有两种方法可以避免这个问题:
- 计算括号并相应地设置它们
- 使用编辑器计算括号
大多数人更喜欢后者。
推荐阅读
- python - 通过输入在 Python 中进行网页抓取
- html - Django,在html中为空文本字段呈现斜体的最佳方法
- wso2 - 迁移的用户无法从 wso2 的管理控制台 UI 登录。
- laravel - 在 Laravel 5 中重新分配或刷新单例
- python - 从 Python 中的 JSON 文件打印特定行
- ruby-on-rails - RSPEC - 测试 to_csv 类方法
- mysql - 在 Cloudera 中使用 sqoop 将数据从 HDFS 导出到 mysql 时作业失败
- django - django - 通过详细名称获取字段
- string - Python 2.7:未知 url 类型:urllib2 - BeautifulSoup
- android - 无法构建 Android Studio 项目