定义函数iota1(n,m),它以n 我尝试过多次切换代码,但似乎无法使其正常运行并以正确的方式显示列表(define (iota1 n m)
(if (eq? n 0)
'()
(append (iota1 (< n m) (+ n 1)) (list n))))
答案 0 :(得分:2)
您提供的代码有些奇怪,为了便于阅读,我对其进行了格式化:
(define (iota1 n m)
(if (eq? n 0)
'()
(append (iota (< n m) (+ n 1))
(list n))))
第一个是表达式(< n m)
的计算值为布尔值,具体取决于n
小于m
。当在表达式{{1}中将iota
应用于(< n m)
时,将为(iota (< n m) (+ n 1))
的第一个参数提供布尔值,而不是正整数。
第二,这里使用iota
很奇怪。在Racket中构造列表时,更常见的是使用函数append
,该函数将一个值和一个列表作为参数,并返回一个将值添加到最前面的新列表。例如,
cons
选择使用(append '(3) (append '(4) (append '(5) '()))) ==> '(3 4 5)
(cons 3 (cons 4 (cons 5 '()))) ==> '(3 4 5)
代替cons
是个好主意,因为它更简单,而且速度更快,因为append
不会像{{1}那样遍历整个列表}。
由于这听起来像是一个家庭作业问题,我将为您提供一个“代码模板”,以帮助您找到答案:
cons
答案 1 :(得分:1)
欢迎来到球拍世界,我的版本在这里:
#lang racket
(define (iota1 n m)
(let loop ([loop_n n]
[result_list '()])
(if (<= loop_n m)
(loop
(add1 loop_n)
(cons loop_n result_list))
(reverse result_list))))