在列表中的给定位置插入元素

时间:2013-03-11 19:49:23

标签: list scheme cons

我不知道如何在列表中的n位置追加元素。 例如:

(insert-at new k lis)
(insert-at ’N 2 ’(a b c d e f))
=>
’(a b N c d e f)

没关系?:

(define (insert-at new k lis)
  (cond (( null? lis)
         (list new))   
        (zero? k   
         (cons new lis))   
        (else       
         (cons (car lis)
               (insert-at new (- k 1) (cdr lis))))))

4 个答案:

答案 0 :(得分:4)

我会给你一些提示 - 因为这看起来像是家庭作业,我不能给你一个直接的答案,如果你通过自己的方式达到解决方案,它会更有用。填写空白:

(define (insert-at new k lis)
  (cond (<???>       ; if the list is empty
         <???>)      ; return a list with the single element `new`
        (<???>       ; if `k` is zero
         <???>)      ; cons `new` with the list
        (else        ; otherwise
         (cons <???> ; cons the lists' current element and
               (insert-at new <???> <???>))))) ; advance the recursion

请注意,这里“推进递归”意味着传递列表的其余部分并将k索引递减一个单位。我们在k索引为零或达到列表结束时完成。不要忘记测试程序:

(insert-at 'N 2 '(a b c d e f))
=> '(a b N c d e f)

(insert-at 'N 0 '(a b c))
=> '(N a b c)

(insert-at 'N 3 '(a b c))
=> '(a b c N)

答案 1 :(得分:1)

如果你有两个功能:

  1. take-n - 返回前N个元素的列表,
  2. last-n - 以列表的形式返回最后N个元素
  3. 然后你可以写:

    (define (insert-at value index list)
      (let ((len (length list)))
        (assert (<= 0 index len))
        (append (take-n index list)
                (list value)
                (last-n (- len index) list))))
    

答案 2 :(得分:0)

(DEFUN INS-ELEM(第N项目清单)

(COND

((&lt; Nth 1)(ERROR&#34;索引太小~A&#34; Nth))

((= Nth 1)(CONS项目清单))

((ENDP清单)(错误&#34;索引太大&#34;)

(T(CONS(FIRST list)(INS-ELEM(1- Nth)item(REST list)))))))

然后,只需致电(INS-ELEM 2&#39;(B C D E F))并自行查看结果。

祝你好运!

答案 3 :(得分:0)

#lang球拍

(define (insert-at Index item lst)

(cond

[(< Index 1) (error "Index too small: " Index)]

[(= Index 1) (cons item lst)]

[(> Index (length lst)) (error "Index too big: " Index)]

[else (cons (first lst) (insert-at (- Index 1) item (rest lst)))]))

user3660248

您关于如何解决此问题的想法似乎是正确的,并且很有意义,但是您在Racket中对它的实现并不正确,我已将其修复,现在可以了:)