nwelch
nwelch

Reputation: 89

Scheme - Recursive cases

I'm finishing up a Scheme assignment and I'm having some trouble with the recursive cases for two functions.

The first function is a running-sums function which takes in a list and returns a list of the running sums i.e (summer '(1 2 3)) ---> (1 3 6) Now I believe I'm very close but can't quite figure out how to fix my case. Currently I have

    (define (summer L)
      (cond ((null? L) '())
        ((null? (cdr L)) '())
        (else (cons (car L) (+ (car L) (cadr L))))))

I know I need to recursively call summer, but I'm confused on how to put the recursive call in there.

Secondly, I'm writing a function which counts the occurrences of an element in a list. This function works fine through using a helper function but it creates duplicate pairs.

(define (counts L)
  (cond ((null? L) '())
        (else (cons (cons (car L) (countEle L (car L))) (counts (cdr L))))))

(define (countEle L x)
   (if (null? L) 0
       (if (eq? x (car L)) (+ 1 (countEle (cdr L) x)) (countEle (cdr L) x))))

The expected output is:

(counts '(a b c c b b)) --> '((a 1) (b 3) ( c 2)) 

But it's currently returning '((a . 1) (b . 3) (c . 2) (c . 1) (b . 2) (b . 1)). So it's close; I'm just not sure how to handle checking if I've already counted the element.

Any help is appreciated, thank you!

Upvotes: 0

Views: 296

Answers (2)

Georg Fuss
Georg Fuss

Reputation: 315

To your first problem:

The mistake in your procedure is, that there is no recursive call of "summer". Have a look at the last line.

(else (cons (car L) (+ (car L) (cadr L))))))

Here is the complete solution:

(define (summer LL)

  (define (loop sum LL)
    (if (null? LL)
      '()
      (cons (+ sum (car LL)) (loop (+ sum (car ll)) (cdr LL)))))

  (loop 0 LL))

Upvotes: 0

law-of-fives
law-of-fives

Reputation: 643

To have a running sum, you need in some way to keep track of the last sum. So some procedure should have two arguments: the rest of the list to sum (which may be the whole list) and the sum so far.

(define (running-sum L)
  (define (rs l s)
    ...)
  (rs L 0))

For the second procedure you want to do something like

(define (count-elems L)
  (define (remove-elem e L) ...)
  (define (count-single e L) ...)
  (if (null? L)
      '()
      (let ((this-element (car L)))
        (cons (list this-element (count-single this-element L))
              (count-elems (remove-elem this-element (cdr L)))))))

Be sure to remove the elements you've counted before continuing! I think you can fill in the rest.

Upvotes: 1

Related Questions