gpt4 book ai didi

scheme - 解决方案中的奇数重复

转载 作者:太空宇宙 更新时间:2023-11-03 19:01:49 26 4
gpt4 key购买 nike

我正在尝试通过仅输出方案中列表中的非重复元素来解决问题。例如:'(a b a a c c) 会给出 (a b)

我已经实现了这个解决方案:

(define (remove L)  
(if (null? L)
L
(let ((firstL (car L)) (restL (cdr L)))
(if (null? restL)
(cons firstL ())
(if (equal? firstL (car restL))
(remove (cdr restL))
(cons firstL (remove restL)))))))

但是它也输出重复次数为奇数的元素。例如:(a b a a a c c) 会给出 (a b a)。

我正在尝试修复它,但我做不到。我尝试过的解决方案之一的示例是:

(define (remove L)  
(if (null? L)
L
(let ((result ()) (firstL (car L)) (restL (cdr L)))
(if (null? restL)
(result)
(if (equal? firstL (car restL))
(remove2 firstL restL)
(append ((list firstL) result))
(remove cdr restL)))))

(define (remove2 x y)
(cond ((null? y) (remove x)
((equal? x (car y)) (remove2 ((car y) (cdr y))))
(else (remove x)))))

如果有人能想出解决方案,请写下来。

最佳答案

您的第二次尝试有很多句法错误。我认为,如果您查看第一次尝试并用缺少的引号 '() 修复一个语法错误,那么如果您可以删除连续的元素而不是仅删除一个元素,那么您几乎已经成功了。例如。制作

(trim-first '(a b c))     ; ==> (b c)
(trim-first '(a a b c)) ; ==> (b c)
(trim-first '(a a a b c)) ; ==> (b c)

那么你就可以用它来代替 cdr:

(define (remove L)  
(if (null? L)
L
(let ((firstL (car L)) (restL (cdr L)))
(if (null? restL)
(cons firstL '())
(if (equal? firstL (car restL))
(remove (trim-first restL))
(cons firstL (remove restL)))))))

我会用 cond 编写它以使其更平坦,并远离非常规的 camelCase 以支持 lisp-case:

(define (remove-runs lst)
(cond ((null? lst) '())
((null? (cdr lst)) lst)
((equal? (car lst) (cadr lst)) (remove-runs (trim-first (cdr lst))))
(else (cons (car lst) (remove-runs (cdr lst))))))

关于scheme - 解决方案中的奇数重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41378614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com