Scheme provides a built-in reverse
procedure, but it applies
only to lists. Suppose one wants to reverse the order of the elements of a
vector?
Actually, there are two variants of this problem. In the first, one wants to keep the container and move the contents around inside it. One algorithm that accomplishes this simply swaps elements that are equidistant from the ends, working from the outside towards the middle:
On the other hand, one may want to leave the original vector unchanged, building and returning a new vector with the same elements, but in the reverse order. This is a job for vector-generator, a procedure that creates a vector of a specified size in which each element is the result of applying a specified procedure to the position of the element. The version given here is lightly adapted from Program 9.21 in Scheme and the art of programming, by George Springer and Daniel P. Friedman (Cambridge, Massachusetts: MIT Press, 1989), p. 283.(define vector-reverse! (lambda (v) (let ((len (vector-length v))) (do ((left-index 0 (+ left-index 1)) (right-index (- len 1) (- right-index 1))) ((<= right-index left-index)) (vector-swap! v left-index right-index)))))
Here, then, is the non-destructive vector reversal procedure:(define vector-generator (lambda (generator size) (let ((vec (make-vector size))) (do ((index 0 (+ index 1))) ((= index size) vec) (vector-set! vec index (generator index))))))
(define vector-reverse (lambda (v) (let ((len (vector-length v))) (vector-generator (lambda (index) (vector-ref v (- (- len 1) index))) len))))
This document is available on the World Wide Web as
http://www.math.grin.edu/~stone/events/scheme-workshop/vector-reversal.html