List 在Scheme中复制列表中找到的每个元素

List 在Scheme中复制列表中找到的每个元素,list,scheme,racket,List,Scheme,Racket,我想复制列表中找到的每个元素。我有这个想法,但我做不好。样本输入为>(pass'(12344))将具有输出(123444)。外面有人帮我吗。这是我的密码 (define duplicate (lambda (mylist n) (cond ((null? mylist) "Not found") ((< n 2) (cons (car mylist) (duplicate mylist (+ n 1)))) (else

我想复制列表中找到的每个元素。我有这个想法,但我做不好。样本输入为>(pass'(12344))将具有输出(123444)。外面有人帮我吗。这是我的密码

  (define duplicate
   (lambda (mylist n)
    (cond ((null? mylist) "Not found")
      ((< n 2) (cons (car mylist)
        (duplicate mylist (+ n 1))))
          (else 
             (duplicate (cdr mylist) 0)))))
  (define pass
     (lambda (mylist)
       (duplicate list 0)))
(定义重复
(lambda(mylist n)
(cond((null?mylist)“未找到”)
(
我将通知所有有价值的评论。

只需一些修复(请参见评论),我们就可以开始了:

(define duplicate
  (lambda (mylist n)
    (cond ((null? mylist) '()) ; base case must return the empty list
          ((< n 2) (cons (car mylist)
                         (duplicate mylist (+ n 1))))
          (else 
           (duplicate (cdr mylist) 0)))))

(define pass
  (lambda (mylist)
    (duplicate mylist 0)))     ; pass myList, not list
或者更好,使用更高阶的过程来获得更惯用的解决方案:

(define (pass lst)
  (foldr (lambda (ele acc) (list* ele ele acc))
         '()
         lst))
还有另一种选择:

(define (pass lst)
  (append-map (lambda (ele) (list ele ele))
              lst))
无论如何,它的工作原理与预期相符:

(pass '(1 2 3 4 4))
=> (1 1 2 2 3 3 4 4 4 4)

replicate
视为用自身ping列表可能更简单。然后对结果列表进行排序

在计划或吵闹中:

(require srfi/1)

(define (duplicate-list-members lox)
  (flatten (zip lox lox)))
虽然它在O(n)时间内运行,但分析可能表明两次遍历列表是一个瓶颈,因此有理由重写函数。也可能不会。

我会这样做:

(define (dup l)
  (define (iter l co)
    (if (null? l)
        (co '())
        (iter (cdr l)
              (lambda (x)
                (co (cons (car l) (cons (car l) x)))))))
  (iter l (lambda (x) x)))

(dup '(1 2 3))
尝试使用地图和列表

(define (duplicate my-list)
  (flatten
    (map 
      (lambda (x) 
      (list x x))
    my-list)))`
提供所需的格式:

> (duplicate (list 1 2 3 4 4))
 '(1 1 2 2 3 3 4 4 4 4)
> (duplicate (list 1 2 3 4 4))
 '(1 1 2 2 3 3 4 4 4 4)