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

时间:2014-09-15 02:19:23

标签: list scheme racket

我想复制列表中的每个找到的元素。我有这个想法,但我无法做到。样本输入是>(传递'(1 2 3 4 4))将具有输出(1 1 2 2 3 3 4 4 4 4)。那里的任何人帮助我。这是我的代码..

  (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)))

我将展示所有有价值的评论。

4 个答案:

答案 0 :(得分:2)

只需要修改一些(请参阅评论),我们就可以了:

(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)
  (if (null? lst)
      '()
      (cons (car lst)
            (cons (car lst)
                  (pass (cdr lst))))))

甚至更好,使用更高阶的程序来获得更惯用的解决方案:

(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)

答案 1 :(得分:1)

我会这样做:

(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))

答案 2 :(得分:0)

duplicate视为zip对自己进行ping操作可能更为简单。然后flatten生成结果列表。

在Scheme或Racket中:

(require srfi/1)

(define (duplicate-list-members lox)
  (flatten (zip lox lox)))

虽然它在O(n)时间运行,但分析可能表明两次通过列表是一个瓶颈,并证明重写函数是正确的。或者它可能不会。

答案 3 :(得分:0)

尝试使用地图和列表

(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)