首页 > 解决方案 > 试图让这段代码工作,无法理解将参数放在哪里并不断出错

问题描述

定义函数 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))))

标签: racket

解决方案


您提供的代码有一些奇怪之处,为了便于阅读,我已对其进行了格式化:

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

第一个是表达式(< n m)计算为布尔值,具体取决于是否n小于m。当您在表达式中应用iotato时,您将为其第一个参数提供一个布尔值,而不是一个正整数。(< 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

推荐阅读