为了记录,这是家庭作业的一部分,但我已经实施了一个解决方案。我只是想知道是否有更好的方法来做到这一点。
背景:我被要求编写一个程序(完整的ls),它接受一个元素列表并从它们创建一个完全连接的图形,即完成。我能够编写辅助函数来协助我的解决方案。
示例图定义为'((a (b c)) (b (a c)))
。其中每个子列表的car
是一个顶点,每个子列表的cdr
是顶点所连接的顶点列表。
例如:
(complete? '((a (b c)) (b (a c)) (c (a b)))) => #t
(complete? '((a (b)) (b (a c)) (c ()))) => #f
我的工作解决方案:
(define (complete ls)
(helpComplete ls ls)
)
(define (helpComplete origLst ls)
(if (null? ls)
'()
(cons
(list
(car ls)
(remove-first (car ls) origLst))
(helpComplete origLst (cdr ls)))))
(define (remove-first element ls)
(cond
[(null? ls) '()]
[(eqv? element (car ls)) (cdr ls)]
[else (cons (car ls) (remove-first element (cdr ls)))]
))
我不允许更改complete
程序的输入,因为我们的评分服务器期望它看起来像现在。我也被禁止使用和!
程序。我们正在运行Petite Chez Scheme Version 8,如果有人关心的话。
上面的代码确实有效,但我想知道是否有更好的方法可以做到这一点?
答案 0 :(得分:0)
这个更简单的版本应该可以使用。
我从remove-first
中的检查中删除了第三个子句,因为在用例下永远无法访问它。
(define (complete ls)
(define (remove-first element in)
(if (eqv? element (car in))
(cdr in)
(cons (car in) (remove-first element (cdr in)))))
(map (lambda (item) (list item (remove-first item ls))) ls)
)