stack93m
stack93m

Reputation: 115

How to write procedure that interleaves two sequences in to one in Scheme

In our exam we had to write a procedure that display first 20 elements of sequence and a procedures that takes 2 sequences and returns one in form of procedure. I wrote an procedures for display-sequence for first 20 elements but I cannot figure out how to make the second procedure which interleave two sequences in to one. I would appreciate any ideas how it can be done.

(define (display-sequence seq)
      (letrec ((iter (lambda (seq i j)
                       (if (= i j)
                           (display "...")
                           (begin (display (seq i))
                                  (display ", ")
                                  (iter seq (+ 1 i) j))))))
        (iter seq 0 20)))

(define (seq-interleave seq1 seq2)
  (lambda (n)
    (if (even? n)
        (seq1 n)
        (seq2 n))))

This should be output when calling these 2 procedures

(display-sequence (seq-interleave sqr (lambda (n) 5)))  
0, 5, 1, 5, 4, 5, 9, 5, 16, 5, 25, 5, 36, 5, 49, 5, 64, 5, 81, 5, ... 

Upvotes: 0

Views: 106

Answers (1)

Óscar López
Óscar López

Reputation: 236004

We just need to map the even numbers back to the corresponding number in the sequence of integers, for example: 2->1, 4->2, 6->3 and so on, doing something similar for the odd numbers. Here's how:

(define (seq-interleave seq1 seq2)
  (lambda (n)
    (if (even? n)
        (seq1 (/ n 2))
        (seq2 (/ (+ n 1) 2)))))

Upvotes: 2

Related Questions