问题描述
我正在尝试创建一个返回列表的相邻重复项的函数,例如(dups'(1 2 1 1 1 4 4)应该返回列表(1 4).
I'm trying to create a function that returns the adjacent duplicates of a list, for example (dups '(1 2 1 1 1 4 4) should return the list (1 4).
这是我到目前为止想出的代码:
This is the code I came up with so far:
(define (dups lst)
(if (equal? (car lst)(car(cdr lst)))
(cons(cdr lst) '())
(dups(cdr lst))))
此函数不会返回所有相邻的重复项,而只会返回第一个相邻的重复项!如何修复它,使其返回列表的所有相邻重复项?
This function doesn't return all the adjacent duplicates, it only returns the first adjacent duplicates!How can I fix it so that it returns all the adjacent duplicates of a list?
谢谢.
推荐答案
一旦您的代码发现重复项,它将停止处理列表的其余部分:当if
测试为true时,将产生(cons (cdr lst) '())
.无论是否找到重复项,它都应该仍在调用dups
来处理列表的其余部分.
Once your code finds a duplicate, it stops processing the rest of the list: when the if
test is true, it yields (cons (cdr lst) '())
. Whether or not it finds a duplicate, it should still be calling dups
to process the rest of the list.
此外:如果您的列表没有重复项,则会遇到麻烦.
Also: if your list has no duplicates, it it going to run into trouble.
这是比发布的其他解决方案更简单的解决方案:
Here's a simpler solution than the others posted:
(define (dups lst)
(if (< (length lst) 2)
; No room for duplicates
'()
; Check for duplicate at start
(if (equal? (car lst) (cadr lst))
; Starts w/ a duplicate
(if (or (null? (cddr lst)) ; end of list
(not (equal? (car lst) (caddr lst)))) ; non-matching symbol next
; End of run of duplicates; add to front of what we find next
(cons (car lst) (dups (cdr lst)))
; Othersise keep looking
(dups (cdr lst)))
; No duplicate at start; keep looking
(dups (cdr lst)))))
这篇关于打印列表的相邻重复项(方案)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!