Shorest-Seek-Time in Scheme

时间:2018-02-21 22:12:34

标签: scheme racket

所以目前我正在研究实现最短寻道时磁盘调度算法的问题。我们的任务是,传递一个轨道列表,返回一个长度为3的列表,其中包含平均移动,总移动,然后是移动量列表。目前我正在处理返回的动作列表,因为我觉得总数和平均值是微不足道的。

我目前所坚持的是保存当前头部位置和当前轨道之间的距离,以便我可以继续搜索列表以获得最短的搜索时间。我首先做的是对列表进行排序并将其传递给一个单独的辅助函数,该函数只返回当前头部位置的最短移动,因此我可以不断调用此函数。

最好的方法是简单地传入另一个变量来保持距离并根据这个数字继续检查吗?一旦我对运动感到满意,然后从列表中删除该磁盘?

1 个答案:

答案 0 :(得分:0)

在Scheme中,将accumulator和state作为辅助函数的额外参数,并使用递归进行更新,以便在执行过程中保持状态而不实际改变绑定。

最简单的例子:

(define (reverse lst)
  (let loop ((lst lst) (acc '()))
    (if (null? lst)
        acc
        (loop (cdr lst) (cons (car lst) acc)))))

(reverse '(1 2 3)) ; ==> (3 2 1)

修改

既然你说你不习惯命名let,这里有一个辅助程序和保持相同的名字:

(define (reverse lst)
  ;; a helper with an accumulator
  (define (loop lst acc)
    (if (null? lst)
        acc
        (loop (cdr lst) (cons (car lst) acc))))
  ;; call the helper
  (loop lst '()))

现在名称looplstacc只是变量名称。但是他们的名字表明loop是一个尾递归程序。 lst是一个列表,acc是累加器的缩写,它在基本情况下表示它将是结果的一部分,对于默认情况,它将被更新。