从List中定义Scheme Programming中的函数?

时间:2014-09-30 12:04:12

标签: scheme

定义一个函数(可能的Schedule),它接受一个参数Schedule,并返回#T或#F。 Schedule是(stage start_time stop_time)三元组的列表,其中每个阶段是正整数,每个start_time和stop_time是0-2399范围内的整数,表示节目的开始和停止时间,使用24小时时间。如果可以执行时间表,该函数应返回#T - 即,如果时间表不包含冲突 - 否则为#F。

您可以假设在调用函数时列表Schedule的格式正确;您不必错误检查非列表或错误形成的列表。列表计划中的事件不一定按阶段编号,开始时间或任何其他顺序排序。在您的程序中,您可以编写和调用任何有助于计算的附加函数。

示例:

(possible '(
    (1 1030 1100)
    (2 900 1000)
    (3 1400 1430)
))

应该返回#T,

(possible '(
    (1 900 930)
    (2 900 1000)
    (3 1400 1430)
))

应该返回#F,

(possible '(
    (7 1130 1200)
    (12 900 1000)
    (2 1500 1530)
    (2 1430 1500)
))

应该返回#T和

(possible '(
    (7 1130 1200)
    (12 900 1000)
    (2 1500 1530)
    (5 1430 1500)
))

应该返回#F。

我尝试创建一个修复列表,如:

  

定义(安排车)   (附表'(((1 1030 1100)(2 900 1000)(3 1400 1430)))   前三个时间表返回#T

1 个答案:

答案 0 :(得分:3)

好问题;可惜你没有向我们展示你所做的努力(如果有的话)。以下是Racket中的一个示例:

(define (possible schedule)
  ; sort by start time
  (let ((s (sort schedule < #:key cadr)))
    (andmap (lambda (f s) 
              ; either end time of first < start time of second
              (or (< (caddr f) (cadr s)) 
                  ; or they are equal AND it's the same stage
                  (and (= (caddr f) (cadr s)) (= (car f) (car s)))))
            (drop-right s 1)
            (cdr s))))