【问题标题】:List splicing in racket球拍中的列表拼接
【发布时间】:2017-10-31 03:16:45
【问题描述】:

我想创建一个名为(splice L i n A) 的过程,其中L 是一个列表,i 是一个索引,n 是元素的数量,A 是另一个列表。所以i 是我想将列表A 插入列表L 的索引,n 是我想从索引i 开始从新列表中删除的元素数。

例如: 如果我跑

(splice '(1 2 3 4 5) 2 1 '(a b c))

这会给我

(1 2 a b c 4 5)

所以我在索引i 处添加了列表'(a b c),并从索引i 开始删除了1 个元素,这将是第3 个。

【问题讨论】:

  • 您的问题是什么?你尝试过什么,你在哪里卡住了?这是作业吗?
  • 我可以将列表 A 拼接到索引 i 处的列表 L 中,但我不知道如何从从 i 开始的原始列表中删除 n 个元素

标签: scheme racket r5rs


【解决方案1】:

在此解决方案中,split 接受延续 k,它采用列表的左侧和右侧部分 L

(define (split L i k)
  (let loop ((left '())
             (right L)
             (i i))
    (if (> i 0)
        (loop (cons (car right) left)
              (cdr right)
              (- i 1))
        (k (reverse left) right))))

;; (split '(1 2 3 4 5) 2 (lambda x x)) => ((1 2) (3 4 5))

如何删除列表的初始元素应该是显而易见的。

(define (chop L n)
  (if (> n 0)
      (chop (cdr L) (- n 1))
      L))

;; (chop '(3 4 5) 1) => (4 5)

如何将这两个函数组合在一起也应该很容易。 split 采用延续,得到左右部分。继续将列表A 附加到左侧部分,然后是右侧部分的其余元素。

(define (splice L i n A)
  (split L i
         (lambda (left right)
           (append left A (chop right n)))))

;; (splice '(1 2 3 4 5) 2 1 '(a b c)) => (1 2 a b c 4 5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2021-12-21
    • 2022-01-20
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多