在方案中完成图表

时间:2014-03-18 14:09:10

标签: recursion graph scheme

为了记录,这是家庭作业的一部分,但我已经实施了一个解决方案。我只是想知道是否有更好的方法来做到这一点。

背景:我被要求编写一个程序(完整的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,如果有人关心的话。

上面的代码确实有效,但我想知道是否有更好的方法可以做到这一点?

1 个答案:

答案 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)
)