racket - 试图让这段代码工作,无法理解将参数放在哪里并不断出错
问题描述
定义函数 iota1(n, m),它以 n < m 的正整数 n, m 作为输入,并输出列表 (n,n+1,n+2,...,m)
我已尝试多次切换代码,但似乎无法使其正常运行并以正确的方式显示列表
(define (iota1 n m)
(if (eq? n 0)
'()
(append (iota1 (< n m) (+ n 1)) (list n))))
解决方案
您提供的代码有一些奇怪之处,为了便于阅读,我已对其进行了格式化:
(define (iota1 n m)
(if (eq? n 0)
'()
(append (iota (< n m) (+ n 1))
(list n))))
第一个是表达式(< n m)
计算为布尔值,具体取决于是否n
小于m
。当您在表达式中应用iota
to时,您将为其第一个参数提供一个布尔值,而不是一个正整数。(< n m)
(iota (< n m) (+ n 1))
iota
其次,append
这里的使用很奇怪。在 Racket 中构造列表时,更常见的是使用函数cons
,它接受一个值和一个列表作为参数,并返回一个新列表,并将值添加到前面。例如,
(append '(3) (append '(4) (append '(5) '()))) ==> '(3 4 5)
(cons 3 (cons 4 (cons 5 '()))) ==> '(3 4 5)
选择使用cons
而不是一个好主意,append
因为它更简单,而且更快,因为cons
它不会像遍历整个列表一样append
。
由于这听起来有点像家庭作业问题,所以我会给你一个“代码模板”来帮助你找到答案:
; n : integer
; m : integer
; return value : list of integers
(define (iota1 n m)
(if (> n m) ; base case; no need to do work when n is greater than m
... ; value that goes at the end of the list
(cons ... ; the value we want to add to the front of the list
(iota1 ... ...)))) ; the call to iota, generating the rest of the list
推荐阅读
- c# - 在 C# 中更新类实例变量的问题
- python - 使用 Python 从 docx 解析表
- node.js - 将 Script 标签和 Body 标签插入 NodeJS Handlebars 模板
- tensorflow - 如果我在机器学习中只有一个小数据集,如何获得更好的结果?
- angular - 如何在 Vscode 中从 Github 运行 Angular 代码
- html - 图像 CSS 之间的空间
- python - 使用日期时间转换日期列表的神秘问题
- javascript - Javascript 转换/更改为布尔值
- go - 如何在函数级别而不是 GoLang 平台中进行元编程或条件编译?
- node.js - Skrill Quick Checkout 中的 MSID 生成