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