试图使此代码正常工作,无法理解将参数放在何处并不断出错

时间:2019-03-24 15:21:45

标签: racket

定义函数iota1(n,m),它以n

我尝试过多次切换代码,但似乎无法使其正常运行并以正确的方式显示列表

(define (iota1 n m)
  (if (eq? n 0)
      '()
      (append (iota1 (< n m) (+ n 1)) (list n))))

2 个答案:

答案 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))))