如何使用Scheme将元素添加到列表的特定位置?

时间:2017-04-04 22:48:42

标签: scheme racket

这是我到目前为止的代码。我相信我很接近,但返回的只是#procedure,承认过程已创建,它不会返回带有新添加元素的列表。我一直在研究这个问题几个小时,我不知道我哪里出错了。

(define (add-into new p lst)
  (cond ((null? lst)
         (cons new lst)
        ((eq? p 0)
         (cons new lst)
        (else 
         (cons (car lst) (add-into (- p 1) new (cdr l)))))))) 

2 个答案:

答案 0 :(得分:0)

您有一个括号问题,在一个地方传递l而不是lst,并且在执行递归调用时参数的顺序不正确。这应该可以解决错误:

(define (add-into new p lst)
  (cond ((null? lst)
         (cons new lst))
        ((= p 0)
         (cons new lst))
        (else 
         (cons (car lst) (add-into new (- p 1) (cdr lst))))))

答案 1 :(得分:0)

只需将代码粘贴到DrRacket并按CTRL + i即可得到:

(define (add-into new p lst)
  (cond ((null? lst)
         (cons new lst)
         ((eq? p 0)
          (cons new lst)
          (else 
           (cons (car lst) (add-into (- p 1) new (cdr l)))))))) 

请注意,您只有一个学期。如果(null? lst)#f,则cond中没有更多字词,因此它将评估为实现定义值,因为它在规范中未定义。在#lang racket中,如果您评估(void)

,则该值与返回的值相同

要解决此问题,您需要关闭cond中的条款,这样您就有3个条款而不是1个条款。当您按Enter键时,您应该看到这一点,但括号与前一个术语不对齐。如果你想使用另一个编辑器,你应该得到一个对齐和缩进lisp语法,因为编写lisp而不会有点痛苦。