我想复制列表中的每个找到的元素。我有这个想法,但我无法做到。样本输入是>(传递'(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)))
我将展示所有有价值的评论。
答案 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)