(define (sumsq l) (if (null? l) 0 (+ (expt (car l) 2) (sumsq (cdr l)) ) ) )
(define (countsymbols l) (if (null? l) 0 (+ (if (symbol? (car l)) 1 0) (countsymbols (cdr l)) ) ) )
(define (avgnums l) (let ((sum 0) (count 0)) (dolist (item l) (if (number? item) (begin (set! sum (+ sum item)) (set! count (1+ count))) ) ) (/ sum count) ))
The following solution uses a tail-recursive auxiliary function:
(define (avgnums l) (avgnumsb l 0 0)) (define (avgnumsb l sum count) (if (null? l) (/ sum count) (if (number? (car l)) (avgnumsb (cdr l) (+ sum (car l)) (1+ count)) (avgnumsb (cdr l) sum count))))
(int-count '(big dog) '(a big dog has a big appetite)) = 3
(define (int-count int l) (int-countb int l 0)) (define (int-countb int l answer) (if (pair? l) (int-countb int (cdr l) (+ answer (if (member (car l) int) 1 0))) answer))
(define (int-count int l) (let ((count 0)) (dolist (x l) (if (member x int) (set! count (+ count 1))) ) count))
(divideby '(3 4 6 17 21 0) 3) = (3 6 21 0)
(define (divideby lst n) (if (pair? lst) (if (= (modulo (car lst) n) 0) (cons (car lst) (divideby (cdr lst) n)) (divideby (cdr lst) n)) '() ) )
(addpoints '(smith (exam 33) (lab 40) (extra 10))) = 83
(define (addpoints lst) (addpointsb (cdr lst))) (define (addpointsb lst) (if (pair? lst) (+ (cadr (car lst)) (addpointsb (cdr lst))) 0))
(define (addpoints lst) (let ((total 0)) (dolist (sublist (cdr lst)) (set! total (+ total (cadr sublist))) ) total))
(profit '((garden 15000 10000) (kitchen 2000 1000))) = 6000It is helpful to define small functions that document what is being done:
(define sales cadr) (define costs caddr) (define (deptprofit dept) (- (sales dept) (costs dept))) (define (profit lst) (if (pair? lst) (+ (deptprofit (car lst)) (profit (cdr lst))) 0))Without the documenting functions, the result is correct but less clear:
(define (profit lst) (if (pair? lst) (+ (- (cadr (car lst)) (caddr (car lst))) (profit (cdr lst))) 0))
(invert '((john 3271234) (mary 4449876)) ) = ((3271234 john) (4449876 mary))
(define (invert lst) (if (pair? lst) (cons (reverse (car lst)) (invert (cdr lst))) '()))
(points '(pawn rook pawn) '((queen 10) (rook 5) (pawn 1))) => 7
(define (points lst pts) (if (pair? lst) (+ (cadr (assoc (car lst) pts)) (points (cdr lst) pts)) 0))
1 3 5 7 9 x x x x x sin(x) = -- - -- + -- - -- + -- - ... 1! 3! 5! 7! 9!Write a function (sine x) to compute sine using this series. You may not use the functions expt or factorial; instead, write a tail-recursive auxiliary function to compute each term of the series from the previous term and add it to the sum. Stop after the 21st power of x. Hint: write down how each term of the series differs from the previous term.
(define (sine x) (sineb x 3 (* x x) x)) (define (sineb term n xsq sum) (if (> n 21) sum (let ((newterm (- (/ (* term xsq) (* (1- n) n))))) (sineb newterm (+ n 2) xsq (+ sum newterm)) ) ) )
(select 'cs 2000 '((john cs 1980) (mary math 1982) (jane cs 1982))) => ((john 20) (jane 18))
(define (select major year lst) (if (pair? lst) (if (eq? (cadr (car lst)) major) (cons (list (car (car lst)) (- year (caddr (car lst)))) (select major year (cdr lst))) (select major year (cdr lst))) '() ) )